c# - 如何检查文件是否正在使用?

标签 c# filestream .net file-access

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

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 上有一些东西,但没有。

有更好的方法吗?

最佳答案

“您可以直接通过 P/Invoke 层调用 LockFile API 函数。您可以使用 FileStream 上的 SafeFileHandle 属性返回的句柄。 直接调用 API 将允许您检查错误条件的返回值,而不是求助于捕获异常。”

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

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

Using C# is it possible to test if a lock is held on a file

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

关于c# - 如何检查文件是否正在使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1314958/

相关文章:

c# - 覆盖现有的 XML 文件(如果它已经存在)

时间:2019-03-24 标签:c#datetimeformat(yyyy-mm-ddT00 :00:00) for google chart date

c# - EventArgs.Empty 说明?

c# - 是否可以将 [XmlAttribute] 作为类的默认值?

c# - 检查Windows 8中是否激活了图片密码

c - 从文件流读取值并将其存储到可变大小数组中 - OpenGL 和 C

.net - FileStream 和内存使用

c# - 我可以使用应用程序 (GUI) 和 Windows 服务创建一个项目,并使用一个安装程序来安装这两个项目吗?

C# Zedgraph 改变短划线长度

c# - 如何确保时间戳始终是唯一的?