代码之家  ›  专栏  ›  技术社区  ›  Graham

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

  •  4
  • Graham  · 技术社区  · 17 年前

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

    是否有可靠的方法来判断FTP是否完成?

    7 回复  |  直到 12 年前
        1
  •  8
  •   John Boker    17 年前

    您可以在上传之前更改文件名,然后在上传完成后重命名。这样一来,它看起来像是在完成之前并不存在。

        2
  •  5
  •   JoshBerke    17 年前

    我见过的一种做法是传输两个文件,一个是实际文件,另一个是我们可以称之为.done文件的文件。理想的情况是,一旦你看到.done文件,你就知道应该完成第一个文件。

    其他选项包括查看文件是否有修改,并等待一定时间不进行修改。当然,这并不是充分的证据。

    编辑

    Kyle很好地指出,在.done文件中添加校验和和/或指示第一个文件的大小可以很好地防止边缘情况。

        3
  •  4
  •   cbrulak    17 年前

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

    这不是对你问题的直接回答,但从长远来看,与其寻找仅支持ftp的解决方案,一个更通用的解决方案可能对你更好。

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

        4
  •  3
  •   Greg B    17 年前

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

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

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

        5
  •  3
  •   Rob Di Marco    17 年前

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

        6
  •  1
  •   Kribensa    17 年前

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

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

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

    如果你无法控制文件的上传方式,你将只能使用FSW来知道文件正在上传,然后监控它的大小——当它长时间保持不变时,你可以 假定 它是完整的。

        7
  •  0
  •   Jeremy    17 年前

    您可能想看看System,而不是轮询。IO.FileSystemWatcher。