前提・実現したいこと
FileSystemWatcherで新規に1行のcsvファイルが追加されるのを監視し、読み込みをしています。
ヘッダなし、順番不定なため、TextFieldParserを使用し、配列に格納
発生している問題・エラーメッセージ
別のプロセスで使用されているため、プロセスはファイル 'xxx.CSV' にアクセスできません。
監視しているフォルダに1sec位の間隔でファイルを設置し、2つめのファイルを設置した段階で上記エラーが発生します。
該当のソースコード
C#
1class FileWatcher 2{ 3 private static FileSystemWatcher watcher; 4 5 public FileWatcher(string filePaht) 6 { 7 watcher = new FileSystemWatcher(); 8 9 // 監視するパス 10 watcher.Path = filePaht; 11 12 // ファイル名と最終書き込み時間 13 watcher.NotifyFilter = NotifyFilters.FileName; 14 15 // フィルタで監視するファイルを.csvのみにする 16 watcher.Filter = "*.CSV"; 17 18 // サブディレクトリを監視しない 19 watcher.IncludeSubdirectories = false; 20 21 // 変更発生時のイベントを定義する 22 watcher.Created += CreateFile; // 新規作成 23 24 // 監視開始 25 watcher.EnableRaisingEvents = true; 26 } 27 28 public static void CreateFile(object source, FileSystemEventArgs e) 29 { 30 Console.WriteLine("create file " + e.FullPath); 31 CsvFileUsecase csvFileUsecase = new CsvFileUsecase(e.FullPath); 32 csvFileUsecase.Read(); 33 } 34 35 public static void StopWatching() 36 { 37 if (watcher != null) 38 { 39 watcher.EnableRaisingEvents = false; 40 watcher.Dispose(); 41 watcher = null; 42 } 43 } 44}
C#
1using (TextFieldParser parser = new TextFieldParser(this.filePath, this.encoding)) 2{ 3 // カンマ区切りの指定 4 parser.TextFieldType = FieldType.Delimited; 5 parser.SetDelimiters(","); 6 7 // フィールドが引用符で囲まれているか 8 parser.HasFieldsEnclosedInQuotes = true; 9 // フィールドの空白トリム設定 10 parser.TrimWhiteSpace = true; 11 12 // 1行のみなのでループは不要 13 // フィールドを読込 14 string[] row = parser.ReadFields(); 15 foreach (string field in row) 16 { 17 // タブ区切りで出力 18 //Console.WriteLine(field); 19 } 20 Console.WriteLine("read end"); 21}
試したこと
該当ソースコードの前に、ファイルアクセス可能かの処理を追加し、アクセス可能な場合は
処理続けるをおこない動作はしましたが、1sec程度待ちが出ます。
補足情報(FW/ツールのバージョンなど)
windows7 professional 64bit
visual studio communitiy 2017
.net 4.5.2
問題なく動作しているようですが、課題はなんでしょうか?
おそらく問題は、FileSystemWatcher側の処理です。
Changedなどのイベントは複数回発生するのです。
説明不足申し訳ありません。
FileSystemWatcherのソースを追加しました。
コンソールのログを見る限り、同じファイルには1度しかアクセスはなく、別ファイルが所定フォルダに登録されても同様に、「別のプロセス~」でエラーになってしまします。
CSVを作成しているプロセスが掴んでいるのではないですかね?普通にその状況はありえるかと思います。
CreateFileの中でイベントの内容が新規作成の場合通るようにすればいいんじゃないでしょうか
回答1件
あなたの回答
tips
プレビュー