.Net 中是否有任何方法可以在打开文件(在本地网络驱动器上)之前检查是否已在使用中?
6 回答
您应该尝试访问它,如果它失败了,您要么没有所需的权限(您可以使用 GetAccessControl 检查),要么它被另一个进程锁定。
但是我认为没有任何可靠的措施可以区分锁定和权限失败(因为您可能能够读取文件,但无法检查权限)。甚至 Windows 的错误消息都说您没有权限,或者它正在被另一个进程使用。
您可以使用 WMICIM_DataFile
类来查询InUseCount
指定的数据文件。
如果您正在寻找与lsof
Linux 中的实用程序等效的程序,要找出给定本地进程的所有打开文件,您可以尝试Win32_Process
通过命名空间使用 WMI 类System.Management
。您可以发出 WMI 查询来查找所有本地进程正在使用的所有打开文件中的文件名,看看它是否存在。或者,您可以 P/Invoke 并NtQuerySystemInformation
直接使用 API 来完成相同的任务。
这会做。MSDN 中提到的 FileShare.None :
无:拒绝共享当前文件。任何打开文件的请求(通过这个进程或另一个进程)都会失败,直到文件被关闭。
File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);
编辑:请记住包装在 Try/Catch 块中,并且使用 FileShare.None 实际上意味着您要以独占方式打开文件。
bool CanReadAndWrite(string path)
{
var perm = new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.Write |
System.Security.Permissions.FileIOPermissionAccess.Read,
path);
try
{
perm.Demand();
return true;
}
catch
{
return false;
}
}
检查您是否可以读取和写入文件。
使用 System.IO.File.OpenWrite(path)。将它包围在一个 try/catch 块中,如果它已经打开以便在其他地方写入,您将收到 System.UnauthorizedAccessException。
以下语法将有所帮助:
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);
通常,您应该始终避免依赖文件可访问性检查。原因是它可能是,然后它可能会在您访问它之前更改几个周期。
相反,只需尝试打开它,看看是否有任何错误。