文件锁定和权限不足导致文件操作失败的情况如何区分?
问问题
568 次
3 回答
4
根据我在这里的回答:有没有办法检查文件是否正在使用?
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)
{
}
于 2013-06-18T03:38:13.030 回答
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
同样的方法是通过检查相应的错误号来尝试异常。
于 2013-06-13T09:07:49.123 回答
1
您可以使用 从文件中读取 ACL,使用GetFileSecurity
获取进程令牌的句柄OpenProcessToken
,然后检查您想要使用的访问权限AccessCheck
。
据我所知,共享规则永远不会阻止您阅读安全性,因此如果您此时访问被拒绝,则可以安全地假设您无权访问该文件。(严格来说,您可能有权限做其他事情,但不能读取 ACL,但这将是一种罕见的极端情况。)
如果AccessCheck
说您有权访问但在打开文件时访问被拒绝,则可以安全地假设这是共享冲突。同样,可能存在边缘情况,例如如果在您查看权限的同时更改权限,但这应该很少见。
于 2013-06-17T21:37:51.150 回答