在Windows中如何知道复制已经完成?

3
我正在编写一个工具,用于监听位置(最好是远程位置),如果创建了新的文件夹或文件,则会将其下载到本地位置。
目前我正在使用FileSystemWatcher监听远程文件夹,当创建新的文件夹/文件时,我会启动一个计时器,如果计时器达到X分钟,则开始将其复制到本地。 在“已监视”文件夹中创建新的文件夹或文件会触发FileSystemWatcher.Changed,但如果有很多子目录并且正在将大文件复制到已监视的文件夹中,则它有时会失败,只有在开始复制时才检测到它,并且我的计时器可能会在复制完成之前结束。
所以: 我有3台远程计算机/位置,A,B,C
A开始将某些文件夹/文件复制到B和C监听B。
如何在使用或不使用FileSystemWatcher的情况下,C检查A是否完成复制? 我不想不断比较B和C并复制剩余的文件。
我查看了其他问题,但它们没有回答我的问题或者我已经实现了那些解决方案。1, 2,3

如果可行的话,您可以在复制时使用一个临时的 xxx.$$$tmp 文件名,然后在复制操作完成后将其重命名为原始文件名。然后,您可以定期扫描目标计算机上不存在的非临时文件。 - Axel Kemper
几乎每一个关于FSW的问题,都会讨论这个问题。仅仅设置一个计时器是没有意义的,你不知道其他进程正在忙于复制文件,在哪台机器上运行以及需要多长时间。保留计时器,但将其间隔设置为较低的值,如100毫秒。继续尝试,最终你可以打开文件。 - Hans Passant
这有用吗: https://dev59.com/XnNA5IYBdhLWcg3wpvtg - PaulF
1个回答

5
我想你在询问系统更改日志。然而,在你检测到需要复制文件和实际开始复制之间,始终会有文件正在使用、已被删除、更新等情况。这是一篇旧但准确的文章,可以为您提供更多详细信息。 http://www.microsoft.com/msj/0999/journal/journal.aspx 从文章摘要中可以看出:
"Windows 2000更改日志是一个数据库,包含有关NTFS 5.0卷上的每个更改(Change)的列表。每个卷都有自己的更改日志数据库,其中包含反映该卷文件和目录发生更改的记录。"
向下滚动到 ReasonMask and ReturnOnlyOnClose 标题。

在阅读答案后,这是一个链接,可以用来开始浏览现代的MSDN - Sergey.quixoticaxis.Ivanov
FileSystemWatcher基本上是原生API ReadDirectoryChanges的包装类,因此在这种情况下我认为应该忽略这个答案。更好的描述请参考以下链接:https://blogs.msdn.microsoft.com/winsdk/2015/05/19/filesystemwatcher-follies/(三篇博客文章中的第一篇)。 - No Refunds No Returns
.Net封装程序忽略了一些在本地API中可用的事件。 - Sergey.quixoticaxis.Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接