我有一些代码,试图从一个可能加密的文件中读取数据。如果它是加密的,那么在实际数据之前有几个字节的信息头。访问文件的逻辑如下:
bool encrypted = IsEncryptedFile(fileName);
Stream s = null;
if (encrypted)
{
s = new EncryptedStreamReader(fileName);
}
else
{
s = new StreamReader(fileName);
}
// Read from s
在极少数情况下(比如10000个文件中的一个),当尝试创建流读取器时,会出现错误“由于另一个进程正在使用该文件xxx,因此无法访问文件”。IsEncryptedFile方法打开文件以读取标头(如果存在),没有其他代码访问该文件。该方法总是关闭文件(它在using语句中打开),并且它总是成功的。
我假设关闭.NET流不保证底层操作系统句柄被关闭,并添加了等待和重试的代码。这减少了错误发生的频率,但仍然偶尔会出现。
我的问题是:
我的假设正确吗?即关闭然后立即打开文件的代码可能会收到此错误,因为Windows仍在释放它,即使.NET Stream.Close方法调用已返回(或using块已退出)?
有没有比扩展重试间隔更好的解决方法?
编辑
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读取'中发生了什么并不重要,因为在那时,文件已经被打开(9999次中的OK - 10000中的1次)或未打开(糟糕 - 10000中的1次)。
using
C#语句 http://msdn.microsoft.com/zh-cn/library/yh598w02.aspx - Alex Fs
也会被关闭和处理吗? - rene