2009-04-17 8 views
1

2つのアプリケーションがあります。 最初のアプリケーションは問題のマシンから離れていて(私はそれに対して何もしていません)、ネットワーク(LAN)経由で大きなファイルを作成します。私はこのプロセスを支配しておらず、いつ起きるかも知らない。これは私と一緒に働かなければならないものです。これを追加、変更、変更することはできません。ファイルのオープンを検出してプロセスを同期させる(作成)

2番目のアプリケーションは私によって書かれ、見つかったらこのファイルを処理します。このアプリは5分ごとに実行されるようにスケジュールされています。

状況が発生する可能性があります。アプリケーションが処理しようとしたときにファイルが処理されている途中で、処理が不完全でエラーが発生する可能性があるため、ファイルが完全に書き込まれたかどうかを検出する必要があります。処理を開始します。

OpenFile()を使用して、読み取り/書き込みロックアクセスを要求できます。エラーは、ファイルが作成されていることを示します。

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

ウォッチャしかし、私は、私が(後でNTと)窓のために考えていないエレガントな方法があると疑われる

答えて

0

完全にハック方法は次のようになり、私はおそらくファイルシステムで巧妙な何かを行うことができますリモートマシンにAPIフックをインストールしてファイルのクローズをクローズし、プログラムを起動するか、完了したという通知を送信します。

+0

残念ながら、リモートプロセス(リモートマシン)はアクセスできません。 –

2

標準的な解決策は、ライターが一時ファイルに書き込みを行った後、ファイルの名前を変更することです。

こうすれば、読者(あなたのアプリ)はファイルが完成したときにしか見ることができません。

+0

私は不幸にも、それを実装するためにライター(リモートプロセス)にアクセスできない。 –

+0

はい、私はあなたのポストを更新したと気付きました...少しOTT私は言わなければならない! –

+0

犯罪は意図されておらず、明快に強調しています:) –

1

昔は、ネットワーク上のファイル(* NIXアプリケーションとNovellファイルサーバー経由のWindowsアプリケーションの間で)を使って通信するソフトウェアを書かなくてはなりませんでした。これを確実に行うために、私たちは常に、データファイルのプロバイダが、データの書き込みを完了したときに余分なハンドシェイクファイル(空のファイルのみ)を作成するように納得させました。私たちのアプリケーションはハンドシェイクファイルをポーリングし、ハンドシェイクファイルが存在する場合はデータファイルを読み込みます。アプリケーションがデータの読み込みを終了すると、ハンドシェイクファイルが削除されます。ハンドシェイクファイルは、ハンドシェイクファイルが存在する限り、データファイルに触れなかったプロバイダによって監視された。

しかし、ほとんどの場合、データのプロバイダはアプリケーションを変更する意思がありました。私はこれを信頼できる方法で提供する唯一の方法はプロバイダからの信号を得るためだと考えています。

+0

私は願っています。不幸にも可能ではありません。 –

+1

はい、ハンドシェークファイルがSHA1ファイルの場合は、データ転送の問題が発生したかどうかもわかります。 – lothar

+0

しかし、他のアプリケーションがファイルにハッシュを書き込んでいる間にファイルを読むことができるので、SHA1を保護するハンドシェイクファイルが必要です。 – rve

3

FileSystemWatcherまたはReadDirectoryChanges経由のシステムウォッチャーソリューションは、あなたが得られる最高のものだと思います。あなたもCodeProjectでthis tutorialをチェックアウトすることができます。とにかくどれほどエレガントになるのだろうか?

2

別の回答:私は突然同じようなことをした別のプロジェクトを思い出しました。私のアプリケーションは、OpenFile()OF_SHARE_EXCLUSIVE(私は思う)を正常にファイルを開くまで使用しています。この場合、アプリケーションがリモートアプリケーションによって書き込まれたファイルに、自分のアプリケーションと同じマシン上の共有にアクセスしていたため、これは正常に動作します。私はファイルサーバー上のファイルでそれをテストしたことはありませんが、動作することができます。ただし、リモートファイルで使用する場合、ファイルのロックは常に信頼できるとは限りません。

0

多くの他の人が既に指摘しているように、唯一の正しい方法は余分な握手です。これは可能ではないようですので、私は以下のことを行います。

  • (デーモンのように)永久に実行するようにアプリケーションを記述します。
  • ファイルをチェックし、あなたはそれ
    • が、それはもはやあなたがそれを転送して行われますことを決めた後
    • は、ファイルの名前を変更(例えば30秒)指定された時間のために成長していないんまで、それはサイズのモニター見つけた場合
    • 名前を変更したファイルを処理する
+0

これは興味深い考えです。私はあなたがより信頼性が高いので、OpenFile()を使用するのではなく、サイズをチェックしたいと思いますか? –

+0

@mmwはタイプミスを修正しました:-) – lothar

関連する問題