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

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

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

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

Q&A

0回答

2440閲覧

FileSystemWatcherでネットワークが切れた後の復帰方法について

ookura

総合スコア27

C#

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

0グッド

0クリップ

投稿2021/10/14 06:20

編集2021/10/14 09:11

お世話になっております。
首記の件で、相談させてください。

FileSystemWatcherで社内のファイルサーバーに存在するフォルダを監視するプログラムを作成したのですが
ネットワークが不安定な時間があるらしく、一度でもネットワークが切れるとイベントをキャッチできなくなるような状況になっております。

対応をいくつか考えたのですが、どうにもうまくいかない為、何かアドバイスをいただければ幸いです。

対応1
非同期で一定間隔おきにStartwatchingを呼び出し
⇒多重で動作するため、いずれオーバーフロー?

対応2
対策1に加え、stopwatchingを呼び出してからStartwatchingで動作をリセットできないか?
⇒多重で起動し続けました

対応3
一定間隔でアプリケーションを再起動
⇒アプリケーションを落とせても、起動ができず。⇒色々試行錯誤中です。

対策1、2で多重で呼び出さないようにFileSystemWatcherをうまくリセットできればいいのですが、どのようにすればいいか全くわかりませんでした・・・。
どなたかご教示いただけますと幸いです。

環境;
windows10
VS2019
.NET Core 3.1.14

C#

1using System; 2using System.IO; 3 4static class TextFileWatcher 5{ 6 private static FileSystemWatcher Watcher; 7 8 public static void StartWatching() 9 { 10 var Watcher = new FileSystemWatcher(); 11 12 // 監視するパス 13 Watcher.Path = @"●●●"; 14 15 // ファイル名と最終書き込み時間 16 Watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; 17 18 // フィルタで監視するファイルを.txtのみにする 19 Watcher.Filter = "*.txt"; 20 21 // サブディレクトリ以下も監視する 22 Watcher.IncludeSubdirectories = true; 23 24 // 変更発生時のイベントを定義する 25 Watcher.Created += Changed; // 新規作成 26 Watcher.Changed += Changed; // 変更 27 Watcher.Deleted += Changed; // 削除 28 Watcher.Renamed += Changed; // リネーム 29 30 // 監視開始 31 Watcher.EnableRaisingEvents = true; 32 33 // 必要がなくなったら監視終了処理(StopWatching)を呼ぶ 34 } 35 36 public static void Changed(object source, FileSystemEventArgs e) 37 { 38 switch (e.ChangeType) 39 { 40 case WatcherChangeTypes.Created: 41 Console.WriteLine($"新規作成: {e.FullPath}"); 42 break; 43 case WatcherChangeTypes.Deleted: 44 Console.WriteLine($"削除: {e.FullPath}"); 45 break; 46 case WatcherChangeTypes.Changed: 47 Console.WriteLine($"変更: {e.FullPath}"); 48 break; 49 case WatcherChangeTypes.Renamed: 50 var renameEventArgs = e as RenamedEventArgs; 51 Console.WriteLine($"リネーム: {renameEventArgs.OldFullPath} => {renameEventArgs.FullPath}"); 52 break; 53 } 54 } 55 56 public static void StopWatching() 57 { 58 if (Watcher != null) 59 { 60 Watcher.EnableRaisingEvents = false; 61 Watcher.Dispose(); 62 } 63 } 64}

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

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

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

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

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

dodox86

2021/10/14 06:31

ちょっと別の話になりますが、 > static class TextFileWatcher > { > private static FileSystemWatcher Watcher; > > public static void StartWatching() > { > var Watcher = new FileSystemWatcher(); ... これ、意味がありますか? Visual Studio で警告が出ていたりしませんか? フィールドで使おうとしていると思われますが、意味ないですよね。 > private static FileSystemWatcher Watcher; これでは StopWatching()メソッドでもif (Watcher != null)に引っかからないはずで、そもそも全体として思惑通りに動いていないはずです。
dodox86

2021/10/14 06:46

> 対策1に加え、stopwatchingを呼び出してからStartwatchingで動作をリセットできないか? > ⇒多重で起動し続けました なんとなくですが、現状のコードではStopWatching()メソッドの意味がないので、デリゲートのイベントに登録したものが生き続けているのだと思います。普通に考えるとちゃんとDisposeまで進めて停めたのにChangedが呼ばれることは考えづらいです。もし疑い・心配があるのであれば -= で外してみてもよいです。
ookura

2021/10/14 08:53

ご回答ありがとうございます。 VSでは警告は特に出ていませんでした。 お恥ずかしい話、ヒントを頂いて、いろいろ試してみたのですが、知識不足で状況が改善しませんでした。 private static FileSystemWatcher Watcherをフィールドで使うつもりだったのですが、うまく機能せずStopWatching()内のdisposeで止められてないところまで理解したのですが・・・ この場合、var Watcher = new FileSystemWatcher();の正しい置き方はどこになるのでしょう・・・。 勉強不足ですみません。調べてみても理解ができませんでした。
dodox86

2021/10/14 09:01

お使いの環境をできるかぎり詳細に、正確に示しましょう。WindowsやVisual Studioのバージョン、.NET Frameworkのバージョンなどです。この欄ではなく、質問本文に追記、修正のかたちで書いてください。本件は環境に依存する場合もあり、そういったことは重要な情報です。 > VSでは警告は特に出ていませんでした。 例えばVisual Studio 2019だとコンパイル時に以下のような警告が出ます。要は「このフィールドは使っていない、使われていない」ということです。 1> TextFileWatcher\Program.cs(11,38,11,45): warning CS0649: フィールド 'TextFileWatcher.Watcher' は割り当てられません。常に既定値 null を使用します
dodox86

2021/10/14 09:08

あまり厳しいことを言いたくもないのですが、フィールドをどう宣言すべきか、メソッドの中でどう扱うべきかという点は、本筋の問題に関する領域の知識不足というよりは C#のクラスの基本部分のお話なのです。
ookura

2021/10/14 09:13

承知致しました。 本件は自身で勉強をし直し解決しようと思います。 ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問