9

書き込み中のファイルから読み取る必要があり、その結果ロックされているアプリケーションがあります。他の質問から理解したように、IOException をキャッチして、読めるまで再試行する必要があります。

しかし、私の質問は、ファイルがロックされていること、および発生した別の IOExcetpion ではないことをどのように確実に知ることができるかということです。

4

6 に答える 6

6

.NETで読み取るためにファイルを開くと、ある時点で、失敗した理由を確認するために使用できるエラーコードを設定するCreateFileAPI関数を使用してファイルハンドルを作成しようとします。

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}
于 2009-03-27T16:06:58.753 に答える
4

あなたが本当に読むべきグーグルグループに関する有用な議論があります。オプションの1つは、darinのものに近いものです。ただし、正しいwin32エラーが発生することを保証するには、実際にwin32 OpenFile()APIを自分で呼び出す必要があります(そうしないと、取得しているエラーが実際にはわかりません)。

もう1つは、エラーメッセージを解析することです。アプリケーションを別の言語バージョンで実行すると失敗します。

3番目のオプションは、実際のHRESULTをフィッシュアウトするために、リフレクションを使用して例外クラス内をハックすることです。

選択肢はどれもそれほど魅力的ではありません。IOException階層は、さらにいくつかのサブクラスIMHOの恩恵を受けます。

于 2009-03-27T16:11:23.657 に答える
0

それを開いて(bezieurの説明に従って)、セクション(またはファイル全体)をロックしてみてください: http://www.java2s.com/Code/VB/File-Directory/Lockandunlockafile.htm

于 2009-03-27T15:54:54.180 に答える
0

データを読み取るには、次のことができます。

using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) { .... }

ファイルに保存するには:

using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Read | FileShare.Delete)) { ... }

コンストラクターの最後のフラグは、他のプロセスがファイルに対して実行できることを示します。もちろん、書き込みと読み取りの両方を制御できれば問題ありません...

于 2009-03-27T15:45:01.897 に答える