2

.Net 中是否有任何方法可以在打开文件(在本地网络驱动器上)之前检查是否已在使用中?

4

6 回答 6

3

您应该尝试访问它,如果它失败了,您要么没有所需的权限(您可以使用 GetAccessControl 检查),要么它被另一个进程锁定。

但是我认为没有任何可靠的措施可以区分锁定和权限失败(因为您可能能够读取文件,但无法检查权限)。甚至 Windows 的错误消息都说您没有权限,或者它正在被另一个进程使用。

您可以使用 WMICIM_DataFile类来查询InUseCount指定的数据文件。

如果您正在寻找与lsofLinux 中的实用程序等效的程序,要找出给定本地进程的所有打开文件,您可以尝试Win32_Process通过命名空间使用 WMI 类System.Management。您可以发出 WMI 查询来查找所有本地进程正在使用的所有打开文件中的文件名,看看它是否存在。或者,您可以 P/Invoke 并NtQuerySystemInformation直接使用 API 来完成相同的任务。

于 2008-12-17T10:22:57.480 回答
2

这会做。MSDN 中提到的 FileShare.None :

无:拒绝共享当前文件。任何打开文件的请求(通过这个进程或另一个进程)都会失败,直到文件被关闭。

File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);

编辑:请记住包装在 Try/Catch 块中,并且使用 FileShare.None 实际上意味着您要以独占方式打开文件。

于 2008-12-17T11:33:38.023 回答
2
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;
    }
}

检查您是否可以读取和写入文件。

于 2008-12-17T11:34:39.847 回答
1

使用 System.IO.File.OpenWrite(path)。将它包围在一个 try/catch 块中,如果它已经打开以便在其他地方写入,您将收到 System.UnauthorizedAccessException。

于 2008-12-17T10:25:02.017 回答
0

以下语法将有所帮助:

FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read);

于 2008-12-17T10:32:59.380 回答
0

通常,您应该始终避免依赖文件可访问性检查。原因是它可能是,然后它可能会在您访问它之前更改几个周期。

相反,只需尝试打开它,看看是否有任何错误。

于 2008-12-17T12:18:58.370 回答