文件:如何区分文件锁定和权限被拒绝的情况?

时间:2013-05-20 04:57:08

标签: .net windows file

如何区分由于文件锁定和缺少权限导致文件操作失败的情况?

3 个答案:

答案 0 :(得分:4)

根据我的回答:Is there a way to check if a file is in use?

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;

private static bool IsFileLocked(Exception exception)
{
    int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
    return errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION;
}

...

FileStream stream = null;
try
{
stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException ex)
{
   if (IsFileLocked(ex))
   {
    // you know the file is locked
   } 
}
catch (ArgumentNullException ex)
{
    HandleException(ex);
}
catch (SecurityException ex)
{
    HandleException(ex);
}
catch (ArgumentException ex)
{
    HandleException(ex);
}
catch (ObjectDisposedException ex)
{
    HandleException(ex);
}
catch (UnauthorizedAccessException ex)
{
    // you know you dont have permission to the file
    HandleException(ex);
}
catch (Exception ex) 
{
}

答案 1 :(得分:2)

最好能抓住IOException代替UnauthorizedAccessException。然后相应地处理它。

 try
 {
     File.Open(_fileName, FileMode.Open, fileAccess, Fileshare.None); 
 }
 catch (IOException e)
 {
     if (!IsFileLocked(e))
         throw;
 }

private static bool IsFileLocked(IOException exception)
{
    int errorNum = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
    return errorNum == 32 || errorNum == 33;
}

这样您就可以检查FileLocked异常。同样的方法是通过检查相应的错误号来尝试Access denied异常。

答案 2 :(得分:1)

您可以使用GetFileSecurity从文件中读取ACL,使用OpenProcessToken获取流程令牌的句柄,然后使用AccessCheck检查您想要的访问权限。

据我所知,共享规则永远不会阻止您阅读安全性,因此如果您在此时获得拒绝访问权限,则可以安全地假设您无权访问该文件。 (严格来说,你可能有权做其他事情,但不能阅读ACL,但这是一个罕见的边缘情况。)

如果AccessCheck表示您有访问权限,但在打开文件时拒绝访问权限,则可以安全地认为这是共享冲突。同样,可能存在边缘情况,例如,如果在查看权限的同时更改权限,但这应该是罕见的。