7

FileSystemWatcher現在閲覧しているファイルをアプリで更新するために、C#アプリケーション(Windowsで実行)でを使用しています。ローカルディレクトリを参照するとうまくいきます。ファイルの名前が変更されたり、削除されたり、追加されたりすると通知されます。ただし、たとえば、ネットワークドライブ上のファイルの名前を初めてFileSystemWatcher変更すると、名前変更アクションが通知され、同じファイルまたは別のファイルの名前を変更するとFileSystemWatcher、エラーが通知されます。

the specified server cannot perform the requested operation

その後、FileSystemWatcherは何も通知しません。

FileSystemWatcherが何も通知しない前に2回名前を変更できる場合があります...

これが私のテストコードです:

    static void Main(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"N:\prive\defFolder";

        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;

        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.Created += new FileSystemEventHandler(watcher_Changed);
        watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.Error += new ErrorEventHandler(watcher_Error);

        watcher.EnableRaisingEvents = true;

        Console.Read();
        watcher.Dispose();
    }

    static void watcher_Error(object sender, ErrorEventArgs e)
    {
        Console.WriteLine("error : " + e.GetException().Message);
    }

    static void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        Console.WriteLine("rename success");
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("change success");
    }
4

2 に答える 2

7

まず第一に、リモート共有のファイルシステム監視は常にある程度信頼性が低くなります。アプリがすべてのイベントを取得することに依存するべきではありません。実際、見逃した可能性のある変更をチェックするためのバックアップポーリングメカニズムを提供することをお勧めします。アプリによっては、GUIの更新ボタンが別のオプションになる場合があります。

そうは言っても、あなたの特定の問題はそれほど珍しいことではないようです。私は少しググって、これらのものを見つけました:

  • 2003サーバーボックスでのFileSystemWatcherの問題-samba共有と、「指定されたサーバーは要求された操作を実行できません」というエラーメッセージが表示された場合と同じ問題のようです。
  • 同じ問題に関する質問と回答の1つは、一部の顧客には効果があり、他の顧客には効果がなかったことを示しています

私の推測では、これはWindowsと組み合わせたSambaの特定のバージョン(または構成)の問題です。LinuxサーバーのSambaログに、問題の原因を示す可能性のあるものはありますか?

すぐに回避できる方法として、次のことを試してみることをお勧めします。

  • FSWが故障した場合でも、フォルダーの変更を確実に取得するポーリングメカニズムを追加します
  • FSWが壊れたら、新しいFSWを作成して「再起動」してみてください。エラーが発生したときにEnableRaisingEventsがに設定されているかどうかを確認することもできます。trueに設定するだけで、イベントの受信を再開できます。false
  • (ここでストローをつかむ)それが問題になる場合に備えて、内部バッファーサイズを試してみてください(疑わしいですが、試してみる価値があります)
于 2012-07-03T08:44:58.510 に答える
0
        if (Directory.Exists(monitorPath))  
        {
            watcher.Path = monitorPath;
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime;
            watcher.InternalBufferSize = 65536;
            watcher.Filter = "test_prod-Pg1_ICT*";
            watcher.Changed += new FileSystemEventHandler(fileChangedEvent);
            watcher.EnableRaisingEvents = true;
            LogEvent("Folder Syncronization Service is Started!");

        }

Samba共有フォルダーonChangesを監視するためのWindowServiceFileSystemWatcherベースのクラスを作成し、CodeProjectのDifferenceEngineを使用して別のクラスを確認し、変更がある場合はWindow共有フォルダーパスにコピーしました。また、ネットワークに障害が発生したときに処理するために10秒ごとにチェックするタイマーを追加しました。変更数を保存するためのリスト配列があります。File Changedイベントが発生したときにリストに追加され、成功したときにリストを削除します。

私はWindow7Pro OSで2台のHPラップトップをテストしましたが、正常に動作しています。

しかし、他のWindow7ProラップトップおよびWindowXPProSP3デスクトップでの作業に失敗しました。(私たちは同じ会社のネットワーク/ VLANとサービスパックを使用しています)

失敗したということは、Samba共有フォルダー内の何かを修正した場合、最新のコンテンツがウィンドウ共有パスに同期されないことを意味します。

私もこれらを追加しました

[PermissionSetAttribute(SecurityAction.LinkDemand、Name = "FullTrust")] [PermissionSetAttribute(SecurityAction.InheritanceDemand、Name = "FullTrust")]

コーディングの上部では、機能していないようです

于 2013-02-14T09:51:00.877 に答える