5

これを行う方法を理解するのにかなりの時間を費やしましたが、有用な解決策は見つかりませんでした。

これが私がやりたいことです。アプリケーションで巨大なバイナリ ファイルを生成しています。注意が必要なのは、このプロセスでは FileStream を時々閉じる必要があることです。問題は、他のアプリケーション (私のウイルス スキャナなど) が、ファイルがロックされていないこの短い瞬間を利用して、ファイル自体をロックすることがあるということです。またはドロップボックスなどの他のアプリケーション...

その結果、次にファイル ストリームを開く必要があるときに、別のプロセスによってロックされていると表示されます。これはすべて非常にまれにしか発生しませんが、発生した場合でも迷惑です。ファイルにアクセスできたとしても、完了するまで Dropbox にこのファイルをアップロードさせたくありません (数分かかる場合があります)。

私が必要とするのは、ファイルを手動でロックして、アプリケーションがこのファイルのファイル ストリームを開くことができるようにすることですが、手動で再度ロックを解除するまで、他のアプリケーションは開くことができません。

疑似コードで次のようなものを描きます。

 File.Lock(filepath);

 //... do something that opens and closes filestreams on this file

 File.Unlock(filepath);

これを行う方法はありますか?「ファイルストリームを開いたままにする」という解決策は無効です。極力避けたいと思いますので、その点はご了承ください。

4

1 に答える 1

7

お気づきのように、ファイルをロックする最善の方法は、FileStream. メインの FileStream は閉じられますが、それを使用してロックをシミュレートできます。オブジェクト自体がロックになるように IDisposable を使用し、それを破棄するFileLockと解放されるサンプル クラスを次に示します。

 public class FileLock : IDisposable
 {
    private FileStream _lock;
    public FileLock(string path)
    {
        if (File.Exists(path))
        {
            _lock = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
            IsLocked = true;
        }            
    }

    public bool IsLocked { get; set; }

    public void Dispose()
    {
        if (_lock != null)
        {
            _lock.Dispose();
        }
    }
}

そして使用法:

using (FileLock lock = new FileLock(filePath))
{
      // Safe in the knowledge that the file is out of harm's way. 
}
于 2012-11-16T18:22:42.157 に答える