C# 文件夹复制完成时的窗口服务

C# 文件夹复制完成时的窗口服务,c#,.net,windows-services,C#,.net,Windows Services,我有一个服务器位置路径,如\\10.100.100.10000\Builds。每当有人在Visual Studio的服务器中启动force build时,就会创建一个新的build文件夹,如2013.1.3.1,并将新文件复制到其中。我需要编写一个Windows服务,因此当文件夹被完全复制时,我需要提取Application.exe并进行一些处理 我的问题是如何知道文件夹是否已完全复制?谷歌和暴饮暴食对我帮助不大。我是否必须告诉我的团队是谁触发构建事件来做一些自定义工作,让我的程序知道复制文件已

我有一个服务器位置路径,如
\\10.100.100.10000\Builds
。每当有人在Visual Studio的服务器中启动force build时,就会创建一个新的build文件夹,如
2013.1.3.1
,并将新文件复制到其中。我需要编写一个
Windows服务
,因此当文件夹被完全复制时,我需要提取
Application.exe
并进行一些处理


我的问题是如何知道文件夹是否已完全复制?谷歌和暴饮暴食对我帮助不大。我是否必须告诉我的团队是谁触发构建事件来做一些自定义工作,让我的程序知道复制文件已经完成?或者有一些.Net库可以完成此任务?

您可以使用FileSystemWatcher监视文件夹中的活动,可以在Windows服务启动时启动监视(在Start方法中)

您可以向FileWatcher注册以下事件处理程序

FSWatcher.Deleted+=new System.IO.FileSystemEventHandler(此.FSWatcher_已删除); FSWatcher.Renamed+=new System.IO.RenamedEventHandler(此.FSWatcher_已重命名); FSWatcher.Changed+=new System.IO.FileSystemEventHandler(此.FSWatcher_已更改); FSWatcher.Created+=new System.IO.FileSystemEventHandler(此.FSWatcher_已创建)

FSWatcher_Changed事件将一直激发,直到复制过程完成

您可以使用此事件了解复制何时开始,并等待复制过程完成

复制过程完成后,我的意思是,当文件夹处于静默状态时,您可以开始提取Application.Exe或执行任何其他您想执行的任务


希望能有所帮助。

我最后就是这样做的,以查看文件夹复制是否已完成。创建一个
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.
    }
}
上面的方法只是每一分钟检查一次文件夹大小,然后比较大小。若大小相同,则声明复制文件夹已完成


希望有帮助。

检查目录的大小,如果没有变大,假设复制过程成功了,如何?在生成解决方案id时,会添加新文件并修改当前文件。当然,建筑规模永远不会相同。这种想法不合适。在这种情况下,请观察该文件夹,如果在超时后大小不再改变,请执行自定义操作,因为生成已完成,或者定义生成后事件来调用应用程序。hmmm…这听起来是个好主意。让我看看我的团队是否批准它…将向您发布最新信息。我认为您可以使用CruiseControl.Net或类似的工具,它可以帮助您。您所说的一切我都知道。我只是问,如何知道复制过程是否完成?我的意思是,也可以通过远程从不同的服务器进行复制。假设您触发了更改事件。你用60秒来启动计时器。如果已更改事件在60秒内未再次触发,则可以假定复制过程已完成,并开始执行您的工作。如果再次触发,请重置计时器。如果您有权访问源文件夹,还可以在复制完成后通过比较源文件夹和目标文件夹来进行验证。只要将FileSystemWatcher设置为监视文件夹,并且帐户具有足够的权限,则无论文件是由本地还是远程应用程序复制的,您都将触发事件。我已经在生产环境中实现了这一点,到目前为止没有任何问题。