【问题标题】:Window Service when folder copying is finished文件夹复制完成时的窗口服务
【发布时间】:2013-03-04 09:25:53
【问题描述】:

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

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

【问题讨论】:

  • 如何检查目录的大小 - 如果它没有变大 - 假设复制过程成功?
  • 在构建解决方案 id 时,会添加新文件并修改当前文件。当然,构建大小永远不会相同。这个想法不合适。
  • 在这种情况下观察该文件夹,如果超时后大小不再变化,请执行自定义操作,因为构建完成或定义构建后事件来调用您的应用程序。
  • 嗯....听起来不错。让我看看我的团队是否批准它....会及时通知您更新。
  • 我认为你可以使用 CruiseControl.Net 或类似的东西,它可以帮助你。

标签: c# .net windows-services


【解决方案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 或您想做的任何其他任务。

希望对你有帮助。

【讨论】:

  • 你说的我都知道。我只是问如何知道复制过程是否完成?我的意思是复制也可以通过远程从不同的服务器发生。
  • 假设您正在触发 Changed 事件。你启动一个计时器,比如说 60 秒。如果更改的事件在 60 秒内没有再次触发,您可以假设复制过程已完成并开始执行您的工作。如果再次触发,请重置计时器。如果您有权访问源文件夹,您还可以在复制完成后通过比较源文件夹和目标文件夹来进行验证。
  • 只要将 FileSystemWatcher 设置为监视文件夹,并且帐户具有足够的权限,无论文件是由本地应用程序还是远程应用程序复制,您都会触发该事件。我已经在生产环境中实现了这一点,到目前为止没有任何问题。
【解决方案2】:

我最后就是这样做的,看看文件夹复制是否完成。创建一个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.
    }
}

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多