2017-04-09 66 views
1

我有一个Node.js程序,它周期性地通过目录中的视频文件循环。如果添加或删除文件,程序将更新数据库以反映此更改。添加文件时,使用FFmpeg生成缩略图。被复制的文件

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

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

+0

你有没有想过“如果文件完成复制,**是完整且正确的**”?你将如何解决这个问题?你有控制文件传输过程吗? –

+0

@AndrewHenle复制是由用户将文件复制或拖拽到目录中完成的。希望操作系统负责成功复制文件。如果文件以某种方式损坏,则程序将退出并显示错误。 – user2248702

回答

0

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

+1

我想这可以在大多数情况下工作,但我经常注意到我的文件传输需要几秒钟才能完成,有时会冻结几秒钟,这会导致一些误报。 – user2248702

+0

因为你正在使用node.js,你可以同时用多个文件来做到这一点。您可以将检查间隔增加到例如。 10秒,或增加检查量。我相信这是做到这一点的唯一方法,不知道任何操作系统中的任何功能都可以满足您的需求。 –

1

假设你有两个过程,一个是写文件和一个书面的文件进行操作:

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

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

请参阅fs.watch它允许您“观察”目录以进行更改。