题
我有一个应用程序,有时需要读取正在写入的文件并因此被锁定。据我从其他人了解到 问题 我应该捕获 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));
您可以比较的类型IOException异常检查,看看它是不是别的东西。
如
if (ex is FileNotFoundException)
您可能要查找在System.IO帮助。在从 IOException的一个该类继承很多例外的>。检查,看它是否是另一种类型的异常之外,你可能有描述的消息看,或者你可能会考虑制作Win32 API调用到SHELL32.DLL。有可能是一个功能在那里检查文件是否被锁定。
另外,如果你绝对需要等待,你可以使用循环,但如果你想要做其他动作,同时等待使用异步线程。