【问题标题】:Is file being copied是否正在复制文件
【发布时间】:2017-09-04 12:51:15
【问题描述】:

我有一个 Node.js 程序,它定期循环浏览目录中的视频文件。如果添加或删除文件,程序会更新数据库以反映此更改。添加文件时,使用FFmpeg生成缩略图。

当我尝试在当前正在复制到目录的文件上运行 FFmpeg 时遇到问题。由于文件不完整,FFmpeg 无法生成缩略图。如果我知道文件何时被复制,我可以忽略它,并且下次扫描目录时会拾取它。

如何确定当前是否正在复制文件,或者我应该如何循环目录而忽略当前正在复制的文件?

【问题讨论】:

  • 您是否也想过“如果文件复制完成,是否完整且正确”?你打算怎么解决?您可以控制文件传输过程吗?
  • @AndrewHenle 复制是由用户将文件复制或拖动到目录中完成的。希望操作系统能够成功复制文件。如果文件以某种方式损坏,程序将退出并出现错误。

标签: javascript node.js file file-io fs


【解决方案1】:

假设你有两个进程,一个写入文件,一个对写入的文件进行操作:

  1. 将文件写入临时文件名 (/tmp/filename)
  2. 复制完成后,立即将其链接到您的目标目录。

使用此策略,您的缩略图进程会监视目标目录的更改,现在可以保证仅包含完整的文件。

请参阅fs.watch,它允许您“监视”目录的更改。

【讨论】:

    【解决方案2】:

    找到文件后,获取当前大小(以字节为单位),然后在 1 秒后检查文件,并检查文件大小是否仍然相同。如果不是,则表示当前正在写入该文件。

    【讨论】:

    • 我想这在大多数情况下都有效,但我经常注意到我的文件传输需要几秒钟才能开始,有时会冻结几秒钟,这会导致一些误报。
    • 因为你使用的是node.js,你可以同时处理多个文件。您可以将检查间隔增加到例如。 10秒,或增加检查量。我相信这是做到这一点的唯一方法,不知道任何操作系统中的任何功能都可以满足您的需要。
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2020-02-03
    • 2020-08-15
    • 1970-01-01
    • 2018-09-27
    • 2016-11-30
    • 2012-05-30
    相关资源
    最近更新 更多