質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

4051閲覧

TextFieldParserを2回実行すると落ちる

tamago83

総合スコア60

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/02/25 08:17

編集2019/02/26 02:50

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/02/25 08:25

問題なく動作しているようですが、課題はなんでしょうか?
hihijiji

2019/02/25 09:16

おそらく問題は、FileSystemWatcher側の処理です。 Changedなどのイベントは複数回発生するのです。
tamago83

2019/02/26 02:52

説明不足申し訳ありません。 FileSystemWatcherのソースを追加しました。 コンソールのログを見る限り、同じファイルには1度しかアクセスはなく、別ファイルが所定フォルダに登録されても同様に、「別のプロセス~」でエラーになってしまします。
takabosoft

2019/02/26 05:48

CSVを作成しているプロセスが掴んでいるのではないですかね?普通にその状況はありえるかと思います。
pontaq

2019/02/26 07:02

CreateFileの中でイベントの内容が新規作成の場合通るようにすればいいんじゃないでしょうか
guest

回答1

0

ベストアンサー

投稿2019/02/26 03:12

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問