監視対象のディレクトリに複数のファイルを配置すると、FileSystemWatcher で問題が発生します。ディレクトリに配置されたらすぐにファイルを解析したい。通常、最初のファイルは正常に解析されますが、ディレクトリに 2 番目のファイルを追加すると、アクセスの問題が発生します。場合によっては、最初のファイルが解析されないこともあります。このディレクトリを実行して監視しているアプリケーションは 1 つだけです。最終的に、このプロセスは複数のマシンで実行され、共有ディレクトリを監視しますが、データがデータベースにインポートされ、主キーがないため、各ファイルを解析できるサーバーは 1 つだけです。
FileSystemWatcher コードは次のとおりです。
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
次に、ファイルを解析するメソッド:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
2番目のファイルを移動すると、引っかかります
System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル 'C:\Temp\TestFile.txt' にアクセスできません。
複数のマシンで実行されている場合、このエラーが表示されると予想されますが、現在は 1 つのサーバーでのみ実行されています。このファイルを使用する別のプロセスがあってはなりません - 私はそれらを作成し、アプリケーションの実行中にディレクトリにコピーします。
これは FileSystemWatcher を設定する適切な方法ですか? このファイルをロックしているものを確認するにはどうすればよいですか? 両方のファイルを解析しないのはなぜですか? FileStream を閉じる必要がありますか? FileShare.None オプションを保持したいのは、ファイルを解析するサーバーが 1 つだけであるためです。ファイルに最初にアクセスしたサーバーがファイルを解析します。