【问题标题】:How to know if copying is finished in Windows?如何知道复制是否在 Windows 中完成?
【发布时间】:2017-10-13 12:51:02
【问题描述】:

我正在编写一个侦听位置的工具,最好是远程位置,如果创建了新文件夹或文件,它会将其下载到本地位置。

目前我正在使用FileSystemWatcher 监听远程文件夹,当创建新文件夹/文件时,我启动一个计时器,如果计时器达到 X 分钟,它开始将其复制到本地。 在“watched”文件夹中创建一个新文件夹或文件会触发FileSystemWatcher.Changed,但如果有很多子目录并且如果有一个大文件复制到被监视的文件夹,它有时会失败,它只会在复制开始和我的计时器时检测到它可以完成,直到完成。

所以: 我有 3 台远程计算机/位置,ABC

A 开始将一些文件夹/文件复制到 BCB

C 如何检查 A 是否在有或没有FileSystemWatcher 的情况下完成复制? 我不想经常比较 BC 并复制其余文件。

我检查了其他问题,但他们没有回答,或者我已经实施了这些解决方案。 1,2,3

【问题讨论】:

  • 如果可行,您可以在复制时使用临时 xxx.$$$tmp 文件名,并在复制操作完成后重命名为原始文件名。然后,您可以定期扫描目标计算机上不存在的非临时文件。
  • 几乎每一个关于 FSW 的问题,而且有很多,讨论这个问题。计时器没有任何意义,您不知道其他进程正在忙于复制文件,它在哪台机器上运行以及需要多长时间。保留计时器,但将其间隔设置为较低的值,例如 100 毫秒。并不断尝试,最终您可以打开文件。

标签: c# windows


【解决方案1】:

我想你是在问系统变更日志。也就是说,在您检测到需要复制文件和真正开始复制之间,总会有文件正在使用、已被删除、更新等情况。这是一篇古老但准确的文章,可以为您提供更多详细信息。

http://www.microsoft.com/msj/0999/journal/journal.aspx

来自文章摘要:

“Windows 2000 更改日志是一个数据库,其中包含对 NTFS 5.0 卷上的文件或目录所做的每次更改的列表。每个卷都有自己的更改日志数据库,其中包含反映该卷文件发生更改的记录和目录。”

向下滚动到标题ReasonMask and ReturnOnlyOnClose

【讨论】:

  • 这是一个链接,可以在阅读答案后提到的文章后从底部开始浏览现代MSDN
  • FileSystemWatcher 基本上是原生 API ReadDirectoryChanges 的包装类,所以我想我会忽略这个答案,直到它发生变化。描述此内容的更好链接:blogs.msdn.microsoft.com/winsdk/2015/05/19/…(3 篇博文中的第一篇)
  • .Net 包装器会忽略本机 API 中可用的一些事件。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2020-02-06
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多