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

时间:2009-02-05 21:49:25

标签: c# file-io ftp

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

无论如何都要知道FTP是否完整?

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

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

修改

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:3)

使用文件夹观察器索引内容怎么样?如果文件大小在5分钟内没有变化,你可以非常保证上传已经完成。

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

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

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

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

如果您无法控制文件的上传方式,您将无法使用FSW知道正在上传的文件,然后监控文件的大小 - 当它长时间保持不变时,您可能会能假设完成。

答案 6 :(得分:0)

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