打开前检查文件是否已被使用(网络驱动器,C#)

时间:2008-12-17 10:18:48

标签: c# file readonly

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

6 个答案:

答案 0 :(得分:3)

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

但我认为没有任何可靠的措施来区分锁和权限失败(因为您可能能够读取文件,但无法检查权限)。甚至Windows的错误消息表明您要么没有权限,要么被另一个进程使用。

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

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

答案 1 :(得分:2)

这样做。 MSDN中提到的F​​ileShare.None:

  

无:拒绝分享当前文件。在文件关闭之前,任何打开文件的请求(通过此过程或其他过程)都将失败。

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

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

答案 2 :(得分: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;
    }
}

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

答案 3 :(得分:1)

使用System.IO.File.OpenWrite(path)。将它包含在try / catch块中,如果它已经打开以便在其他地方写入,则会出现System.UnauthorizedAccessException。

答案 4 :(得分:0)

以下语法将有所帮助:

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

答案 5 :(得分:0)

通常,您应始终避免依赖文件辅助功能检查。原因可能是,它可能会在您访问它之前改变几个周期。

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