1

System.IO.FileSystemWatcher ディレクトリ内のファイルの名前変更に関する通知を受け取るためにを使用しています。このファイルは、別のプロセスによって作成されたログ ファイルです。

イベント ハンドラは次のようになります。

      private async void FileRenamedHandler(object sender, RenamedEventArgs e)
      {
          //when file is renamed
          //try to upload it to a storage
          //if upload is succesful delete it from disk 
      }

これまでのところすべて問題ないように見えますが、既存のログ ファイルをストレージにアップロードするために、このアプリケーションの起動時にディレクトリを反復処理する 2 つ目のメソッドを追加する必要があります

それで

    public async Task UploadAllFilesInDirectory()
    {
        foreach (var file in Directory.GetFiles(_directoryPath))
        {
          await TryUploadLogAsync(file);
        }
    }

問題は、たとえば次のような競合状態になることです。

  • ファイルの名前が変更され、FileRenamedHandler がトリガーされますが、同じ塗りつぶしがUploadAllFilesInDirectoryメソッドによって解析されます。この時点で、同じファイルを 2 回アップロードするか、既に削除されているため、ディスクから削除しようとすると例外が発生します。

    このコードでは、より多くの競合状態のケースを見ることができます。

どうすればこれを解決できますか?

ありがとう

4

2 に答える 2