2016-04-15 15 views
0

FileSystemWatcher:私は私のPC上で実行しているシンプルなFileSystemWatcherサービスを作成したソートアルゴリズム

public static void Run() 
    { 

     var watcher = new FileSystemWatcher 
     { 
      Path = @"C:\Users\XXX\Google Drive", 
      NotifyFilter = NotifyFilters.LastAccess 
          | NotifyFilters.LastWrite 
          | NotifyFilters.FileName 
          | NotifyFilters.DirectoryName, 

      Filter = "*.*", 
     }; 

     watcher.Created += OnChanged; 
     watcher.EnableRaisingEvents = true; 
    } 

    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     FooPrintClass.SendToPrinter(e.FullPath); 
    } 

あなたは私がGoogleドライブのフォルダを見ている見ての通り。そのフォルダも私のサーバー上で同期されます。時々私のサーバー上のシステムは、同じ名前を持つが、切り抜いた型にファイルの2ペアを作成します。

(Foo.pdf, Foo.txt) 

時々システムがこれらのペアの50の上に作成され、それらはすべてが私のGoogleに同期されますドライブフォルダ。

私のFileSystemWatcherサービスは予期したとおりに動作しますが、並べ替えの問題ではまったく扱われません。 私のサービスは、一度に実際に各ペアを処理する必要があります。

Expected Result: 
Foo.pdf, Foo.txt 
Bar.pdf, Foo.txt 

Actual Result: 
Bar.txt, Foo.pdf 
Foo.txt, Bar.pdf 

期待される結果が示すように、私は最初にペアを印刷する必要があります。 "キュー"ソリューションを実装する方法はたくさんありますが、私の場合はいくつのファイルがあるのか​​分かりません。だから私はファイルの合計を知らないので、それはキューとソートアルゴリズムを構築するのが難しいでしょう。

ヒント?

+0

配列(または適切なデータ構造)に配置すると、ソート....................... –

+0

FileSystemWatcherは、一度に1ファイルずつ処理します。上記のようにGoogleドライブを使用しています。つまり、一部のファイルは他のファイルの前に同期させることができます。 – Dandy

+0

idは、それが取得されたときにそれらをあなたに送信することを期待します。そのため、ファイルのペアがキャッシュされ、並行して実行されるため、順序が保証されません。 – BugFinder

答えて

0

ファイルを同期させるために3Dパーティシステムを使用しているので、どのように処理されるかを制御することはできません。あなたは問題を抱えているかもしれません。つまり、順序や同期が制御されていなくても、監視されたファイルからの通知がロックされていないことを保証するものではありません。

シンクロオーダーの問題を簡単にするために、バンドル内のファイルを同期させることができます。 これらのファイルを作成するシステムを変更できる場合は、両方のファイルを1つのzipファイルでZIPできます。 Foo.zipを使用すると、両方のファイルを必要な順序で印刷できます。

可能なロックの問題は解決しません。新しいファイルペアについてサービスに通知することができれば、APIを使用してGoogleドライブから直接これらのファイルをダウンロードできます。この場合、ファイルとその取得順序を完全に制御できます。

+0

ロックについてもっと詳しく説明できますか?それはいつできるのですか?今や、新しいペアのファイルに関するサービスは今のところ存在しません。 – Dandy

+0

1つのアプリケーションがファイル(Googleドライブ)の書き込みや更新を行っている場合は、ウォッチャーから通知を受けることができますが、この時点ではファイルは閉じられていません。したがって、他のアプリケーション(サービス)が開こうとすると、エラーが発生する可能性があります。これは、最初のアプリケーションがどのようにファイル、競合状態で動作するか、スキーマに大きく依存します。問題は、あなたのコンピュータ上で、同じ少量のファイルでかなりうまくいくかもしれないが、実際の状況下では問題に遭遇する可能性があるということです。他のアプリケーションに加えて、将来、ファイルで動作する方法が変更される可能性があります。後で問題が発生する可能性があります。 –

+0

一般に、ロバストなアプローチではありません。少なくとも、アルゴリズムを実装するときは、通知を受け取ってすぐにファイルにアクセスし、再試行のアプローチを実装する必要はありません。 –

0

Reactive Extensionsを使用すると、いくつかのイベントをバッファリングして並べ替えることができます。

の例では、このようなものになるだろう:

Observable 
    .FromEventPattern<FileSystemEventArgs>(watcher, "Created") 
    .Buffer(TimeSpan.FromSeconds(10)) 
    .Subscribe(onNext); 

public void onNext(IList<string>) { ... } 

の例では、10秒で起こったすべての変更をバッファリングし、リストとしてonNextに渡します。これにより、他の作業を行う前にファイルをソートすることができます。

これは、バッファウィンドウが終了した時点で作成されているファイルのようなエッジケースを無視します。しかし、これらの問題を解決する方法は複数あります。

+0

いいですね。しかし、ファイルのペアごとに10秒を追加すると、パフォーマンスに負の影響を与えます。 – Dandy

+0

'バッファ 'は単なる1つのオプションです。 Rxは2番目のファイルが表示されるまで(順序に関係なく)待ってから、両方のファイルを関数に渡すようにすることができます。私はすぐにそれを行う方法の答えを持っていません。しかし、特定のキープレスの組み合わせなどを待つソリューションを見ることができます。 – Chrono

関連する問題