FileStreamを使用してファイルロックを実装できますか?
-
29-09-2019 - |
質問
使用できますか 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他のプロセス?私が使うべき他の何かがありますか?
編集:より具体的には、これは単一のマシン上のローカルファイルを使用してMicrosoft CLR上にあります。
解決
これはあなたが望むことをします。 FileShare.None
重要な部分です。
すべてのライターアプリが同じコンピューターにある場合は、 名前付きMutex 物理ファイルが必要にならずに同じ目標を達成するため、またはファイルに最後に書き込みをしている人を気にしない場合は、ファイルアクセスを媒介するために(書き込みは同時にありません)。これにより、毎回ファイルを再開する必要がなく、あなたの代わりにブロッキングセマンティックを提供することができます。 Sleep
ループ(より良いパフォーマンス)。
名前が秘密として扱われない場合は、ファイル(Mutex)、すなわち安全に保つ必要がある情報としてファイル(Mutex)をスクワットできることに注意してください。
他のヒント
これは、次の注意事項を考慮して機能します。
- あなたはWindowsにあります(Mono経由のLinuxでは、ファイルロックがアドバイザリーであるため、これは持ちこたえていないので、あなたの方法は常に成功します)
- ローカルファイルにアクセスしています(SMBもおそらく機能しますが、NFSまたはWebDAVはほぼ確実に機能しません)
- IOExceptionをキャッチすることはおそらく広すぎるので、共有違反のために失敗したことを具体的に確認する必要があります
所属していません StackOverflow