.net FileSystemWatcher工作完成了吗?

.net FileSystemWatcher工作完成了吗?,.net,disk,filesystemwatcher,.net,Disk,Filesystemwatcher,我在本地文件系统目录上设置了一个FsWatcher。我只想知道文件何时被添加到目录中,以便可以移动到另一个文件系统。我似乎能够检测到第一个文件何时进入,但实际上我想知道给定复制操作中的所有文件何时完成 如果我使用Windows资源管理器将文件从一个目录复制到另一个目录,资源管理器会告诉我,传输时间还剩n秒,因此,虽然每个文件的开始传输和结束传输都有一些活动,但似乎所有文件的开始传输和结束传输都有一些活动 我想知道是否有类似的东西我可以用.NET框架来做。我想知道“所有”文件何时在“事务”中,而不

我在本地文件系统目录上设置了一个FsWatcher。我只想知道文件何时被添加到目录中,以便可以移动到另一个文件系统。我似乎能够检测到第一个文件何时进入,但实际上我想知道给定复制操作中的所有文件何时完成

如果我使用Windows资源管理器将文件从一个目录复制到另一个目录,资源管理器会告诉我,传输时间还剩n秒,因此,虽然每个文件的开始传输和结束传输都有一些活动,但似乎所有文件的开始传输和结束传输都有一些活动

我想知道是否有类似的东西我可以用.NET框架来做。我想知道“所有”文件何时在“事务”中,而不仅仅是单个文件。如果没有现成的东西,也许我应该想出一些等待/反击的方法,以便只在工作“完成”时才进行活动

不确定我是否100%理解这一点,请任何人评论


谢谢。

我过去实现这一点的方法是使用一个带有特殊名称的“marker”文件,例如“end”。此文件始终是最后写入的文件,并作为多文件事务完成时间的指示器。如果只有一个线程正在编写这些文件集,那么这将很好地工作

如果有许多线程,每个线程可能正在写入一组文件,那么您需要以某种方式将每个“结束”文件与其标记的文件集相关联。一种方法是在文件名中包含GUID(或其他唯一标识符),例如

{GUID1.file1.bin,GUID1.file2.bin,GUID1.end}

{GUID2.file1.bin,GUID2.file2.bin,GUID2.end}


另一种方法是将每个集合中的所有文件压缩到一个压缩文件中,这样您只需查看单个文件。

没有文件副本事务这样的事情。您只能监视目录中的单个文件更改

Explorer可以这样做,因为它知道您要做什么(将这些x文件从此处复制到此处)

您甚至不知道何时写入(或更一般地修改)此文件。您必须尝试以独占方式锁定该文件,以便知道您是唯一访问该文件的人

AdamRalph提到的.end文件技巧是唯一真正接近您想要做的技巧


Mario

写一个文件指示要添加的文件列表怎么样?作为第一步,应用程序会拾取它,读取它,然后等待要写入的文件。当最后一个文件被写入时,您可以打包并发送它们。这样,如果启动了多个“事务”,您就不会有“结束文件”相互干扰。为指示符文件指定一个已知的模式名,以便查找在常规文件中不太可能出现的模式名,并提供一些方法,使多个指示符文件可以在类似的时间出现

如果我要实现这样的东西,我可能会使用某种文件名,比如
~.tmp
,我的文件系统监视程序将监视该格式名称的单个文件,这反过来会告诉另一个文件系统监视程序等待其中列出的文件。文件移出后,可以删除临时文件

这种方法可以很容易地进行线程化,这样您的每个观察者就不会互相攻击,也不会传输/删除其他观察者正在处理的文件


不过,正如前面所建议的,将文件压缩到一个单独的归档文件中并使用它,在目标位置解包,可能会更有效。

对我来说很有意义。如果要将一组文件复制到目录,则不希望在将每个文件复制到目录时对其进行处理。您希望等到组中的所有文件都被复制后再采取操作。您很好地说明了多个写入线程的可能性。我已经更新了我的答案,并建议使用“结束”文件解决方案来处理这个问题。您的建议肯定有效,但我更愿意避免实际打开标记文件并读取其内容。然后,当提供不完整的集合时,您必须在中途处理可能的故障,并且您可能必须提供一个超时,以便您的组件不会“等待”不完整的集合。使用“结束”解决方案,在“结束”文件存在之前,您不关心文件夹中的任何文件。@AdamRalph或将完成的文件放在
GUID1.end
文件中,而不是从标记文件开始。写入.end文件时,文件已成功复制,您可以从.end文件中提取文件列表,而无需在每个文件名前面加上GUID。