文件夹复制完成后的窗口服务

时间:2013-03-04 09:25:53

标签: c# .net windows-services

我有一个像\\10.100.100.10000\Builds这样的服务器位置路径。每当有人在Visual Studio中的服务器中激活强制构建时,就会创建一个新的构建文件夹,如2013.1.3.1,并将新文件复制到其中。我需要写一个Windows Service所以当文件夹被完全复制时,我需要提取Application.exe并进行一些处理。

我的问题是如何知道文件夹是否已完全复制?谷歌搜索和Binging并没有帮助我。我是否必须告诉正在触发构建事件的团队做一些自定义工作,让我的程序知道复制文件已经完成?或者有一些.Net库来完成这项任务?

2 个答案:

答案 0 :(得分: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或您想要执行的任何其他任务。

希望它有所帮助。

答案 1 :(得分: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.
    }
}

上述方法只需每分钟检查一次文件夹大小,然后比较大小。如果大小相同,则声明复制文件夹已完成。

希望它有所帮助。