我有一个像\\10.100.100.10000\Builds
这样的服务器位置路径。每当有人在Visual Studio中的服务器中激活强制构建时,就会创建一个新的构建文件夹,如2013.1.3.1
,并将新文件复制到其中。我需要写一个Windows Service
所以当文件夹被完全复制时,我需要提取Application.exe
并进行一些处理。
我的问题是如何知道文件夹是否已完全复制?谷歌搜索和Binging并没有帮助我。我是否必须告诉正在触发构建事件的团队做一些自定义工作,让我的程序知道复制文件已经完成?或者有一些.Net库来完成这项任务?
答案 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.
}
}
上述方法只需每分钟检查一次文件夹大小,然后比较大小。如果大小相同,则声明复制文件夹已完成。
希望它有所帮助。