我有一个应用程序,有时需要读取正在写入的文件并因此被锁定。据我从其他人了解到 问题 我应该捕获 IOException 并重试,直到我可以读取为止。

但我的问题是我如何确定文件已被锁定并且它不是另一个 IOExcetpion 发生。

有帮助吗?

解决方案

当您在 .NET 中打开文件进行读取时,它会在某个时刻尝试使用 创建文件 API 函数设置 错误代码 可以用来查看失败的原因:

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

其他提示

有对一个有用的讨论谷歌组你真的应该阅读。其中一个选项是接近Darin的;然而,为了保证您得到正确的Win32错误,你真的应该调用Win32的OpenFile()API自己(否则,你真的不知道你是哪个检索错误)。

另一个是解析错误信息:如果您的应用程序上的另一语言版本的运行将失败

一个第三选项是将异常类内破解与反射捡出实际HRESULT。

替代品都不是真的那么有吸引力:IOException异常层次结构将从几个子类恕我直言受益。

要阅读,你可以做数据:

  

使用(的FileStream FS =新   的FileStream(文件名,FileMode.Open,   FileAccess.Read,FileShare.ReadWrite |   FileShare.Delete)){....}

和保存到文件:

  

使用(的FileStream FS =新   的FileStream(文件名,FileMode.Append,   FileAccess.Write,FileShare.Read |   FileShare.Delete)){...}

在构造函数的结束标志描述了其它方法可与该文件做。它是好的,当然,如果你控制写和读...

您可以将其打开(如通过bezieur描述),然后尝试锁定部分(或整个文件): http://www.java2s.com/Code/VB/File-目录/ Lockandunlockafile.htm

你的意思是你都读取和写入文件?或外部应用程序被写入到它。

如果你正在做的阅读和写作,然后我假设你正在做它在不同的线程在这种情况下,看看在ReaderWriteLock类会为你做这个的管理,并允许您提供超时。

http://msdn.microsoft.com/en -us /库/ system.threading.readerwriterlock.aspx

否则所有你需要做的是在只读模式下打开该文件。那么你不应该有任何问题:

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));
scroll top