Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileSystemWatcher和写入完成_C# - Fatal编程技术网

C# FileSystemWatcher和写入完成

C# FileSystemWatcher和写入完成,c#,C#,我正在实现一个事件处理程序,它必须打开并处理由我无法控制的第三方应用程序创建的文件的内容。“简言之,C#4.0”(第495页)中有一条注释警告我,在文件完全填充之前打开文件有风险;因此,我想知道如何处理这种情况。为了尽量减少事件处理程序的负载,我正在考虑让处理程序简单地在队列中插入文件名,然后使用不同的线程来管理处理,但是,无论如何,我如何确保写入完成并且文件读取是安全的?文件大小可以是任意的 有什么想法吗?谢谢我们的解决方法是关注特定的扩展。上载文件时,扩展名为“.tmp”。上传完成后,将重命

我正在实现一个事件处理程序,它必须打开并处理由我无法控制的第三方应用程序创建的文件的内容。“简言之,C#4.0”(第495页)中有一条注释警告我,在文件完全填充之前打开文件有风险;因此,我想知道如何处理这种情况。为了尽量减少事件处理程序的负载,我正在考虑让处理程序简单地在队列中插入文件名,然后使用不同的线程来管理处理,但是,无论如何,我如何确保写入完成并且文件读取是安全的?文件大小可以是任意的


有什么想法吗?谢谢

我们的解决方法是关注特定的扩展。上载文件时,扩展名为“.tmp”。上传完成后,将重命名为具有适当的扩展名


另一种方法是让服务器尝试在try/catch块中移动文件。如果fie没有上传完成,移动文件的尝试将引发异常,因此我们等待并重试。

实际上,您不知道。如果其他应用程序的“写入”操作是打开文件,拒绝其他所有人的写入权限,则在完成后,关闭该文件。当您收到通知时,您只需打开请求写访问权限的文件,如果失败,您就知道操作尚未完成。但是,如果“写入”操作是打开文件、写入、关闭文件、再次打开文件、再次写入等等,那么您的运气就差多了

我见过的最好的解决方案是在最后一次通知后设置计时器。当计时器过期时,尝试打开文件进行写操作——如果可以的话,假设“操作”已完成,并执行您需要执行的操作。如果打开失败,则假定操作仍在进行中,然后再等待一段时间


当然,没有什么是万无一失的。尽管存在上述情况,但在您对文件执行所需操作时,可能会启动另一个操作,并导致交互问题。

实现所需操作的可靠方法可能是使用FileSystemWatcher+NTFS USN journal。 可能比您预期的要复杂,但仅FileSystemWatcher无法确定新创建的文件是否已关闭

-首先是FileSystemWatcher,以了解文件是何时创建的。从那里你就有了完整的文件路径,还有1到2个Pinvoke可以获得文件的唯一ID(这可以帮助你在它的整个生命周期中跟踪它)

-然后,阅读USN日志,它会跟踪驱动器上发生的一切。筛选与新文件ID对应的条目,并读取日志,直到到达带有“Close”事件的条目

从这里开始,除非您的文件以特殊方式被操作(由生成它的应用程序多次打开和关闭),否则您可以假定读取它是安全的,并且可以对它执行任何您想执行的操作

StCroixSkipper的工作是USN日志解析器的一个非常出色的C#实现,可在以下位置获得:


如果您感兴趣,我可以在我的项目中使用USN journal时为您提供更多有关USN journal的帮助。

我忘了指定:该程序不是客户机-服务器程序,它在桌面上工作,因此我猜提示都不起作用。。。还是我错了?两者都可以在桌面应用程序中使用。问题是一样的,解决办法也是一样的。事实上,一个更肮脏但更便宜/更容易实现大致相同的目标的方法是按照merci bien pur ton aide,c'est trés interest中的建议去做。这是我的助手所选择的。