5

コンストラクターを使用して、FileStream一度に1つのプロセスのみがファイルにアクセスするようにすることはできますか?次のコードは機能しますか?

public static IDisposable AcquireFileLock() {
    IDisposable lockObj;
    do {
        // spinlock - continually try to open the file until we succeed
        lockObj = TryOpenLockFile();

        // sleep for a little bit to let someone else have a go if we fail
        if (lockObj == null) Thread.Sleep(100); 
    }
    while (lockObj == null);

    return lockObj;
}

private static FileStream TryOpenLockFile() {
    try {
        return new FileStream(s_LockFileName, FileMode.Create, FileAccess.Read, FileShare.None);
    }
    catch (IOException) {
        return null;
    }
}

特に、FileMode.CreateアトミックWRTでの動作は他のプロセスですか?他に使うべきものはありますか?

編集:より具体的には、これは単一のマシンでローカルファイルを使用するMicrosoftCLRにあります。

4

2 に答える 2

2

これはあなたが望むことをします。 FileShare.None重要な部分です。

すべての書き込みアプリが同じコンピューター上にある場合は、名前付きミューテックスを使用して、物理ファイルを必要とせずに同じ目標を達成したり、最後に誰がファイルに書き込みを行ったかを気にしない場合にファイル アクセスを仲介したりすることもできます (それだけです)。書き込みは並行ではありません)。これにより、毎回ファイルを再度開く必要がなくなり、Sleepループの代わりにブロッキング セマンティックを提供できます (より良いパフォーマンス)。

名前が秘密として扱われない場合、つまり安全に保つ必要がある情報である場合、どのプロセスもファイル (Mutex) を占有できることに注意してください。

于 2010-11-29T18:05:28.410 に答える
1

これは、次の注意事項を考慮して機能します。

  • あなたは Windows を使用しています (Linux では Mono 経由でファイル ロックが推奨されるため、これは保持されないため、メソッドは常に成功します)。
  • ローカル ファイルにアクセスしています (SMB もおそらく動作しますが、NFS や WebDAV はほぼ確実に動作しません)。
  • IOException のキャッチはおそらく広すぎるため、共有違反が原因で失敗したことを具体的に確認する必要があります
于 2010-11-29T18:16:07.880 に答える