gpt4 book ai didi

c# - 流关闭后文件保持锁定状态

转载 作者:行者123 更新时间:2023-11-30 17:50:18 25 4
gpt4 key购买 nike

我有一些代码试图从可能加密或未加密的文件中读取。如果它是加密的,那么它在实际数据之前有一个带有几个字节信息的 header 。访问文件的逻辑如下:

bool encrypted = IsEncryptedFile(fileName);
Stream s = null;

if (encrypted)
{
s = new EncryptedStreamReader(fileName);
}
else
{
s = new StreamReader(fileName);
}

// Read from s

在极少数情况下(例如,10000 个文件中只有一个文件),我在尝试创建流读取器时收到错误“该进程无法访问文件 xxx,因为它正被另一个进程使用”。 IsEncryptedFile 方法打开文件以读取 header (如果存在)并且没有其他代码访问该文件。该方法总是关闭文件(它在 using 语句中打开)并且总是成功。

我假设关闭 .NET 流并不能保证底层操作系统句柄已关闭并添加了代码以等待并在一定时间间隔后重试。这降低了错误发生的频率,但它仍然偶尔会发生。

我的问题是:

我的假设是否正确,即关闭然后立即打开文件的代码可能会收到此错误,因为 Windows 仍在释放它,即使 .NET Stream.Close 方法调用已返回(或 using block 已退出)?

有没有比延长重试间隔更简单的解决方法?

编辑

IsEncryptedFile 做这个

private bool IsEncryptedFile(string fileName)
{
using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
//Read header from fileStream
//Returns true if encrypted else false
}
}

出于显而易见的原因,我没有包括实际逻辑,但无论如何它都是无关紧要的,因为您需要知道的是流始终关闭(使用语句).

不存在多线程问题。我的代码没有其他部分访问该文件。每个文件只调用一次该方法。 “从 s 中读取”中发生的事情并不重要,因为此时文件已经打开(正常 - 10000 次中的 9999 次)或未打开(错误 - 10000 次中的 1 次)。

最佳答案

确保您使用 usingtry finally 子句正确处理流。

此外,您可以使用 FileStream 设置文件访问选项。

例如:

bool encrypted = IsEncryptedFile(fileName);
Stream s = null;
try
{
if (encrypted)
{
s = new EncryptedStreamReader(fileName);
}
else
{
s = new FileStream(fileName, FileMode.Open, FileAccess.Read);
}

// Read from s
}
finally
{
if (s != null)
s.Close();
}

检查所有打开流的方法(例如 IsEncryptedFile)以确保所有流都正确关闭。

关于c# - 流关闭后文件保持锁定状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com