web-dev-qa-db-ja.com

ファイルが開いているかどうかを確認する

ファイルが既に開いているかどうかを確認する方法はありますか?

17
protected virtual bool IsFileinUse(FileInfo file)
{
     FileStream stream = null;

     try
     {
         stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
     }
     catch (IOException)
     {
         //the file is unavailable because it is:
         //still being written to
         //or being processed by another thread
         //or does not exist (has already been processed)
         return true;
     }
     finally
     {
         if (stream != null)
         stream.Close();
     }
     return false; 
}
27
Pranay Rana

@pranay ranaと同じですが、ファイルハンドルを確実に閉じる必要があります。

public bool IsFileInUse(string path)
{
  if (string.IsNullOrEmpty(path))
    throw new ArgumentException("'path' cannot be null or empty.", "path");

  try {
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
  } catch (IOException) {
    return true;
  }

  return false;
}
8
Matthew Abbott

ファイルを開こうとする前に、ファイルが開いているかどうかを確認したい場合は、いいえ。 (少なくとも、低レベルになることなく、システムで開いているすべてのファイルハンドルを調べます。)

また、入手した情報は古くなっています。テストでファイルが開いていないことが返された場合でも、戻り値を使用する前に開かれている可能性があります。

したがって、状況を処理する適切な方法は、ファイルを開いて、発生する可能性のあるエラーを処理することです。

1
Guffa

同意した。オープンファイルロジックまたは少なくともテスト(IsFileAvailable)をラップする指定クラスを作成します。これにより、特に責任のあるクラスを使用して例外管理を配置し、再利用可能にすることができます。さらに詳細な応答を提供するために、ファイルサイズがテストされてファイルが書き込まれているかどうかを確認するなど、さらにロジックを適用することもできます。また、使用するコードがよりクリーンになります。

0
NoelAdy