【发布时间】:2012-05-20 18:06:42
【问题描述】:
我希望能够(以编程方式)移动(或复制和截断)不断使用和写入的文件。这将导致写入的文件永远不会太大。
这可能吗? Windows 或 Linux 都可以。
具体来说,我正在尝试使用 FFMPEG 记录视频并创建长达一小时的视频。
【问题讨论】:
标签: windows linux ffmpeg copy truncate
我希望能够(以编程方式)移动(或复制和截断)不断使用和写入的文件。这将导致写入的文件永远不会太大。
这可能吗? Windows 或 Linux 都可以。
具体来说,我正在尝试使用 FFMPEG 记录视频并创建长达一小时的视频。
【问题讨论】:
标签: windows linux ffmpeg copy truncate
在 Windows 和 Linux 中都可以,但需要相关应用程序之间的合作。如果将新数据写入文件的应用程序不知道其他应用程序在做什么,它可能无法工作(嗯......有一些可能性......稍后再回到那个)。
一般来说,要使其正常工作,您必须打开共享文件。例如,如果使用 Windows API CreateFile,则两个应用程序都可能需要指定 FILE_SHARE_READ 和 FILE_SHARE_WRITE。这将允许两个(多个)应用程序“同时”读取和写入文件。
不过,除了共享文件之外,还需要协调应用程序之间的操作。您将需要使用某种锁定机制(通过锁定文件的某些部分或某些共享互斥体/信号量)。请注意,如果您使用文件锁定,您可以锁定文件中的一些已知偏移量以充当“信号量”(它甚至可以是超出文件物理结尾的字节值)。如果一个应用程序在另一个应用程序截断文件的同时附加到文件,那么这将导致不可预知的结果。
回到关于两个应用程序需要相互了解的评论......如果两个应用程序以独占方式打开文件并不断重试操作直到成功,则执行操作,然后关闭文件,它本质上将允许他们在没有彼此“知识”的情况下工作。但是,这可能效果不佳,效率也不是很高。
说了这么多,出于效率原因,您可能需要考虑替代方案。例如,如果可以让写入应用程序定期写入新文件,那么它可能比必须不断地将数据从一个文件“移动”到另一个文件更有效。此外,如果您需要维护文件的某些部分(例如,将前 100 MB 移出到另一个文件,然后将第二个 100 MB 移到开头),这也可能是一项相当昂贵的操作。
【讨论】:
logrotate 是 linux 的一个不错的选择,几乎任何发行版都有库存。我确定某处有类似的 Windows 服务
【讨论】: