1

ファイルのロックやアクセス許可の不足によりファイル操作が失敗した場合を区別する方法は?

4

3 に答える 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 に答える