4

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

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

技术论坛建议使用一个命令“lsof”。它有一个提供文件状态的文件描述列。

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

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

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

提前感谢您的帮助。

谢谢, 马修 Liju

4

3 回答 3

4

我们以前曾以多种不同的方式做到这一点。

方法一:

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

然后让您的侦听器进程注意哨兵文件。创建其中一个时,您应该处理等效的数据文件,然后将两者都删除。

任何超过一天的数据文件并且没有相应的标记文件,删除它 - 这是一个失败的传输。

方法二:

密切关注文件本身(特别是最后修改日期/时间)。只处理过去修改时间超过N几分钟的文件。这增加了处理文件的延迟,但您通常可以确定,如果一个文件在五分钟内没有被写入(例如),它就完成了。

结论:

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

第一个的好处是当哨兵文件出现时你就知道文件准备好了。使用这两者lsof(我假设您将任何进程未打开的文件视为准备好处理)和时间戳,FTP 可能在中间崩溃并且您可能正在处理半个文件。

于 2009-07-31T09:14:59.893 回答
1

对于这类问题,通常有三种方法。

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

lsof可能是一种选择,尽管您已经确定了您的 Linux 可移植性问题。如果您使用它,请注意 -F 选项,该选项将输出格式化为适合其他程序处理,而不是人类可读的。

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

于 2009-07-31T09:18:50.887 回答
0

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

于 2014-08-28T07:45:01.440 回答