2

ディレクトリを数秒ごとにポーリングして、新しい入力ファイルのディレクトリを監視するアプリケーションを作成しています。多くの場合、新しいファイルは数メガバイトになるため、入力ディレクトリに完全に到着するまでに時間がかかります (例: リモート共有からのコピー時)。

ファイルが現在コピー中であるかどうかを検出する簡単な方法はありますか? どの方法もプラットフォームやファイルシステムにとらわれないことが理想ですが、それができない場合は、プラットフォームごとに特定の戦略が必要になる場合があります。

数秒間隔で 2 つのディレクトリ リストを取得してファイル サイズを比較することを既に検討しましたが、これは時間と信頼性のトレードオフになり、他に方法がない場合を除き、上司は満足していません。

背景として、アプリケーションは一連の Matlab M ファイルとして作成されているため、JRE/CLR のトリックはありません...


編集:ファイルは、ネットワーク ドライブまたはローカル ファイルシステムの別の場所から直接移動/コピー操作によって直接入力に到着しています。このコピー操作は、おそらく別のアプリケーションではなく、人間のユーザーによって開始されます。

その結果、制御ファイルを追加したり、中間ステージング領域を使用したりする責任をファイルプロバイダーに負わせることはかなり困難です...


結論:これを行う簡単な方法はないように思われるので、ベルトとブレースのアプローチに落ち着きました。次の場合、ファイルは処理の準備ができています。

  • そのサイズは一定期間変化しません
  • ファイルを読み取り専用モードで開くことができます (一部のコピー プロセスではファイルがロックされます)。

回答をくださった皆さん、ありがとうございました。

4

5 に答える 5

7

最も安全な方法は、ファイルをディレクトリに配置するアプリケーションに、最初にファイルを別の一時ディレクトリに配置してから、実際のディレクトリに移動させることです (これは、FTP またはファイル共有を使用している場合でもアトミック操作である必要があります)。 . 命名規則を使用して、1 つのディレクトリ内で同じ結果を得ることもできます。

編集: それは、そのコピー機能に「完成したファイル」の概念さえあるかどうかに応じて、ファイルシステムに本当に依存します。SMB プロトコルについてはよくわかりませんが、その概念があれば、SMB インターフェイス (または Samba にパッチを当てる) を公開するアプリと、ファイルのコピーが完了したときに通知を受け取る API を作成できます。多分仕事は多いですけどね。

于 2008-12-05T10:21:43.010 に答える
3

これは非常に古いミドルウェアの問題であり、短い答えは「いいえ」です。

2 つの「ソリューション」は、ファイル アップローダーに責任を負わせます。(1) ファイルをステージング ディレクトリにアップロードしてから、それを宛先ディレクトリに移動します (2) ファイルをアップロードし、「準備完了」ファイルを作成/アップロードします。コンテンツ ファイルの状態を示します。

最初の方が優れていますが、どちらもエレガントではありません。真実は、ファイルシステムよりも優れた通信メディアが存在するということです。HTTP POST、JMS または MSMQ キューなど、プッシュまたはプル (ファイルシステムのように両方ではない) のみを含む IPC の使用を検討してください。さらに、これは同期することもでき、プロセスがファイルを受信できるようになりますコンテンツを承認し、価値があるかどうかを確認し、クライアントに領収書を渡す - これが否認防止への正しい道です。これに従えば、ファイルが処理のためにサーバーに配信されたかどうかについて議論されることはありません。

M.

于 2008-12-05T10:32:45.483 に答える
1

1 つの簡単な方法は、かなり長い間隔 (2 ~ 5 分) でポーリングし、新しいファイルを 2 回目に表示したときにのみ確認することです。

ファイルがロックされているかどうかを確認する以外に、ファイルがまだコピーされているかどうかを判断する方法をOSで知りません。

于 2008-12-05T10:21:46.847 に答える
1

ファイルはどのようにそこに到達していますか? 書き込み時に属性を設定し、書き込みが完了したときに属性を変更できますか? これは、書き込みを行っている人が行う必要があります...これはオプションではないようです。

それ以外の場合は、リストをキャッシュし、2 つの連続したリストのファイル サイズが同じ場合、そのファイルを新しいものとして扱うことが、私が考える最善の方法です。

または、ファイルの変更時刻を使用することもできます。ファイルは新しく、変更時刻が少なくとも x 過去のものである必要があります。しかし、これはリストをキャッシュすることとほぼ同等になると思います。

数秒ごとにフォルダーをポーリングしている場合、時間のペナルティはそれほど多くありませんか? そして、そのプラットフォームに依存しません。

また、Linux のみ: http://www.linux.com/feature/144666

cron に似ていますが、ファイル用です。特定の問題をどのように処理するかわかりませんが、役立つかもしれませんか?

于 2008-12-05T10:21:53.837 に答える
0

あなたのOSは何ですか。UNIX では、「lsof」ユーティリティを使用して、ユーザーがファイルを書き込み用に開いているかどうかを判断できます。どうやら、MS Windows Process Explorer のどこかに同じ機能があります。

または、ファイルを排他的に開いてみて、失敗から抜け出すこともできます。しかし、これは少し信頼性に欠ける可能性があり、自分の足で踏むのは簡単です.

于 2008-12-05T10:55:14.673 に答える