4

在尝试打开文件进行读取之前,有什么方法可以先测试文件是否正在使用中?例如,如果文件仍在被写入或被认为正在使用,则此代码块将引发异常:

try
{
    FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (IOException ex)
{
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}

我环顾四周,我能找到的最好的方法是执行某种轮询,里面有一个 try catch,感觉hacky。我希望会有一些东西,System.IO.FileInfo但没有。

有什么更好的方法吗?

4

2 回答 2

4

“您可以通过 P/Invoke 层直接调用 LockFile API 函数。您将使用 FileStream 上 SafeFileHandle 属性返回的句柄。直接调用 API 将允许您检查返回值是否存在错误情况,而不是诉诸捕捉异常。”

try/catch 块是正确的解决方案(尽管您想捕获 IOException,而不是所有异常)。您无法正确同步,因为测试锁 + 获取锁不是原子操作。”

请记住,文件系统是易变的:仅仅因为您的文件在一次操作中处于一种状态并不意味着它将在下一次操作中处于相同状态。您必须能够处理来自文件系统的异常。”

使用 C# 是否可以测试文件是否持有锁

http://www.dotnet247.com/247reference/msgs/32/162678.aspx

于 2009-08-22T02:36:46.213 回答
0

一个会尝试并执行它的函数只会在循环中尝试捕获。就像数据库一样,找出你是否可以做某事的最好方法是尝试去做。如果失败,请处理它。除非您的线程代码已关闭,否则您的程序没有理由不能打开文件,除非用户在另一个程序中打开它。

当然,除非你在做有趣的事情。

于 2009-08-22T02:37:44.357 回答