3

Perl でディレクトリ、特にディレクトリのサイズを監視する方法を見つけようとしています。ディレクトリ サイズの変更を検出すると、特定のアクションを実行します。
私が抱えている問題は、このディレクトリにコピーするのにかなりの時間を必要とする大きなファイル、つまり> 100MBです。(Unix ではなく Windows で) 何が起こるかというと、ファイルのコピーがまだ進行中であっても、システムはファイル全体に対して十分なディスク領域を予約します。私のスクリプトは、コピーが完了していないこのファイルに対してアクションを実行しようとするため、これは問題を引き起こします。Unix では「du」を介してディレクトリ サイズの変更を簡単に検出できますが、Windows の「du」は同じように動作しません。

Perl でディレクトリ サイズの変更を検出する正確な方法はありますか?

編集:明確にするいくつかのポイント: - 私の Perl スクリプトは特定のディレクトリのみを監視しており、新しいファイルまたは新しいディレクトリを検出すると、この新しいファイルまたはディレクトリに対してアクションを実行します。ファイルをコピーしていません。ネットワーク上のユーザーは、私が監視しているディレクトリにファイルをコピーします。- 問題は、非常に大きな (100MB を超えるが、通常は数 GB) 新しいファイルまたはディレクトリが表示され (コピーされ、移動されていない)、このコピーが完了する前にプログラムが起動した場合に発生します。 - Unix では、問題のファイル/ディレクトリのサイズが大きくなっているのを簡単に「du」して確認し、適切なアクションを実行できます - Windows ではサイズが静的であるため、この変化を検出できません - opendir/readdir/closedir は違います表示されるディレクトリの一部には数千のファイルが含まれている可能性があるため、実行可能であり、次のオーバーヘッドを回避したい

理想的には、変更時にプログラムがトリガーされるようにしたいのですが、これを行う方法がわかりません。現時点では、変更を検出するまでビジー状態で待機しています。ファイル/ディレクトリのサイズの変更は、私の管理下にありません。

4

5 に答える 5

3

根本的な問題に対処するのではなく、その問題を回避しているようです。ファイルのコピーが終了したときに、プログラムが通知を適切に送信していません。OS 固有のメカニズムを使用して、操作がいつ完了したかを間接的に判断しようとする代わりに、そうしないのはなぜですか?

于 2010-06-07T17:36:34.280 に答える
3

Linux::Inotify2またはWin32::ChangeNotifyを使用して、ディレクトリ/ファイルの変更を検出できます。

編集: File::ChangeNotifyはより良いオプションのようです (クロスプラットフォーム & Catalystで使用)

于 2010-06-08T09:16:01.780 に答える
1

私が理解しているように、何千ものファイルを含むディレクトリをポーリングしています。新しいファイルが表示されると、そのファイルに対して実行されるアクションがあります。ファイルが使用中またはコピー中の場合、これにより問題が発生しますよね?

潜在的にいくつかの解決策があります。

1) flockを使用して、ファイルがまだ別のプロセスで使用されているかどうかを検出します (OS、ファイル システム、および Perl バージョンで正しく動作するかどうかをテストします)。

2) Windows で LockFile 呼び出しを使用します。失敗した場合は、OS または別のプロセスがそのファイルを使用しています。

3) ポーリング間隔をサーバーの非ビジー時間に変更し、プロセスが完了するまでディレクトリをオフラインにします。

于 2010-06-08T02:25:56.673 に答える
0

ディレクトリのサイズを評価することは、最も経験の浅い Perl プログラマー以外ならできることです。du次のことを知っていれば、15 行のコードで独自のポータブル バージョンを作成できます。

  1. globまたはディレクトリopendir / readdir / closedir内のファイルを反復処理する
  2. 通常のファイルとディレクトリ名を区別するファイルテスト演算子 ( -f file、など)-d file
  3. ファイルのサイズを取得するためのstat関数またはファイル サイズ演算子-s file
于 2010-06-07T18:14:54.020 に答える
0

File::Monitor と呼ばれる優れたモジュールがあり、新しいファイル、削除されたファイル、サイズの変更、および stat で実行できるその他の属性を検出します。その後、ファイルが出力されます。

http://metacpan.org/pod/File::Monitor

ベースライン スキャンを設定してから、探している各アイテムのコールバックを設定します。

$monitor->watch( {
    name        => 'somedir',
    recurse     => 1,
    callback    => {
        files_created => sub {
            my ($name, $event, $change) = @_;
            # Do stuff
        }
    }
} );

1 レベルよりも深くする必要がある場合は、必要なレベルまで行ってください。これが完了し、新しいファイルが見つかった後、アプリケーションをトリガーして、ファイルに対して必要なことを実行できます。

于 2010-08-09T01:58:51.810 に答える