如何判断文件是否已完成FTP?

我们有一个C#Windows服务轮询一个等待FTP文件发布的文件夹。为了避免在文件仍被写入时使用该文件,我们首先尝试锁定文件,但是,似乎有在创建FTP文件之后但在写入文件之前我们获取文件锁定的情况,因此我们最终打开一个空文件。

有没有可靠的判断FTP是否完整?

如何使用文件夹观察器对内容编制索引,如果文件大小在5分钟内没有变化,则可以非常保证上传已完成。

超时可能与FTP服务器的超时有关。

http://www.codeproject.com/KB/files/MonitorFolderActivity.aspx

您可以在上传之前更改文件名,然后在完成后重命名。 这样看起来好像直到完成才会存在。

我见过的一种做法是你传输两个文件,一个是实际文件,然后是另一个我们可以调用.done文件的文件。 理想的是,只要您看到.done文件就知道第一个文件应该完成。

其他选项包括观察文件进行修改并等待一段时间没有修改。 当然这不是完全证据。

编辑

Kyle明确指出,在.done文件中添加校验和和/或指示第一个文件的大小是对边缘情况的良好保护。

我一直是.filepart协议的忠实粉丝,所以无论你使用什么传输协议(ftp,ssh,rsync等),你都有相同的理解。

这不是您问题的直接答案,但是从长远来看,更通用的解决方案可能更适合您,而不是搜索仅支持ftp的解决方案。

(.filepart:将文件重命名为test.txt到test.txt.filepart,然后在完成后,将其命名为test.txt)

我一直使用校验和文件。 因此,您发送一个校验和文件,表示文件大小和校验和。 当第一个文件中的校验和与文件系统上的实际校验和匹配时,您将知道文件已正确上载。

我过去使用的方法是这里的一些其他回复的混合。 即使用与预期的扩展名不同的扩展名(例如FILENAME.part)来FTP文件,然后使用适当的扩展名将其重命名为上传的最后一步。

在服务器上,使用FileSystemWatcher查找具有正确扩展名的新文件。 FSW在重命名之前不会看到该文件,并且重命名操作是primefaces操作,因此文件将在重命名时完成并可用。

重命名或移动文件当然取决于您可以控制上传过程。

如果您无法控制文件的上传方式,那么您将无法使用FSW知道正在上传的文件,然后监控文件的大小 – 当它长时间保持不变时,您可以假设它完整​​了。

您可能希望查看System.IO.FileSystemWatcher而不是轮询。