1

のようなサーバー ロケーション パスがあります\\10.100.100.10000\Builds。誰かが Visual Studio のサーバーで強制ビルドを起動すると、 のような新しいビルド フォルダー2013.1.3.1が作成され、新しいファイルがそこにコピーされます。を書く必要があるWindows Serviceので、フォルダーが完全にコピーされたら、抽出Application.exeして何らかの処理を行う必要があります。

私の質問は、フォルダが完全にコピーされたかどうかを知る方法ですか? グーグルとビンジングはあまり役に立ちませんでした。ファイルのコピーが完了したことをプログラムに知らせるために、ビルド イベントを発生させているチームにカスタム作業を行うように指示する必要がありますか? または、このタスクを実行するための .Net ライブラリがいくつかありますか?

4

2 に答える 2

1

FileSystemWatcherを使用して、フォルダー内のアクティビティを監視できます。監視は、Windowsサービスの開始時に開始できます([開始方法]の場合)。

次のイベントハンドラーをFileWatcherに登録することができます

FSWatcher.Deleted + = new System.IO.FileSystemEventHandler(this.FSWatcher_Deleted); FSWatcher.Renamed + = new System.IO.RenamedEventHandler(this.FSWatcher_Renamed); FSWatcher.Changed + = new System.IO.FileSystemEventHandler(this.FSWatcher_Changed); FSWatcher.Created + = new System.IO.FileSystemEventHandler(this.FSWatcher_Created);

FSWatcher_Changedイベントは、コピープロセスが終了するまで発生し続けます。

このイベントを使用して、コピーがいつ開始されたかを確認し、コピープロセスが終了するまで待つことができます。

コピープロセスが終了したら、つまり、フォルダーが静かになったら、Application.Exeまたはその他の実行したいタスクの抽出を開始できます。

それが役に立てば幸い。

于 2013-03-04T10:52:54.800 に答える
1

これが、フォルダのコピーが終了したかどうかを確認するために最終的に行った方法です。を作成し、プロパティSystem.IO.FileSystemWatcherでイベントを割り当てCreatedます。

private void FileSystemWatcherCreated(object sender, FileSystemEventArgs e)
{
    long sizeOld = GetDirectorySize(new DirectoryInfo(e.FullPath));

    Thread.Sleep(100000);

    long sizeNew = GetDirectorySize(new DirectoryInfo(e.FullPath));

    if (sizeOld == sizeNew)
    {
        // Copying finished.
    }
}

上記の方法では、1分ごとにフォルダーのサイズを確認してから、サイズを比較します。サイズが同じ場合は、フォルダのコピーが終了したことを宣言します。

それが役に立てば幸い。

于 2013-03-07T13:28:44.153 に答える