验证ftp是否完整?

时间:2009-07-31 08:52:04

标签: ftp lsof

我有一个连续轮询文件夹的应用程序。一旦任何文件ftp到文件夹,应用程序必须将此文件移动到其他文件夹进行处理。

在这里,我们没有任何选项可以验证ftp是否完整。

技术论坛中建议使用一个命令“lsof”。它有一个文件描述列,它给出了文件状态。

因为这是一个免费的bsd命令,并且在旧版本的linux中没有,我想澄清一下这个命令的用法。

您能告诉我们您在文件验证方面的经验吗?还有其他替代解决方案吗?

此外,使用此实用程序有任何风险吗?

提前感谢您的帮助。

谢谢, Mathew Liju

3 个答案:

答案 0 :(得分:4)

我们之前已经以多种不同的方式完成了这项工作。

方法一:

如果您可以控制发送文件的过程,请让它自己发送文件后跟一个sentinel文件。例如,发送真实文件"contracts.doc",后跟一个字节"contracts.doc.sentinel"

然后让你的监听程序进程注意sentinel文件。当创建其中一个时,您应该处理等效数据文件,然后删除它们。

任何超过一天且没有相应的sentinel文件的数据文件,摆脱它 - 这是一个失败的传输。

方法二:

密切关注文件本身(特别是最后修改日期/时间)。仅处理过去修改时间超过N分钟的文件。这会增加处理文件的延迟,但您通常可以确定,如果文件未在五分钟内写入(例如),则已完成。

结论:

这些方法过去都成功地被我们使用过。我更喜欢第一个,但是当我们不允许更改发送文件的过程时,我们不得不使用第二个。

第一个优点是,当发送sentinel文件时,知道文件已准备就绪。使用lsof(我假设您正在处理任何进程未打开的文件已准备好处理)和时间戳,FTP可能在中间崩溃,您可能正在处理半个文件。

答案 1 :(得分:1)

通常有三种解决此类问题的方法。

  1. 提供信号文件,以便在传输文件时,发送附加文件以标记传输已完成
  2. 在该目录中的日志文件中添加一个条目以指示传输已完成(这实际上只有在您有一个对等方更新目录时才有效,以避免并发问题)。
  3. 解析文件以确定完整性。例如文件以长度字段开头,还是显然不完整?例如解析不完整的XML文件将导致由于缺少end元素而导致的解析错误。根据文件的大小和格式,这可能很简单,也可能非常耗时。
  4. 虽然您已经确定了Linux可移植性问题,但

    lsof可能是一个选项。如果你使用它,请注意-F选项,它格式化适合其他程序处理的输出,而不是人类可读的。

    编辑:Pax确定了我忘记的第四种(!)方法 - 使用文件的时间戳在一段时间内没有更新的事实。

答案 2 :(得分:0)

有第五种方法。您还可以检查FTP会话是否仍处于活动状态。如果每个对等方拥有自己的ftp用户帐户,这将有效。只要用户没有从FTP注销,就假定文件不完整。