1

我希望能够(以编程方式)移动(或复制和截断)一个不断使用并被写入的文件。这将导致被写入的文件永远不会太大。

这可能吗?Windows 或 Linux 都可以。

具体来说,我正在尝试使用 FFMPEG 记录视频并创建一小时长的视频。

4

2 回答 2

2

在 Windows 和 Linux 中都是可能的,但需要相关应用程序之间的合作。如果将新数据写入文件的应用程序不知道其他应用程序在做什么,它可能无法工作(嗯......有一些可能性......稍后再回到那个)。

通常,要使其正常工作,您必须打开共享的文件。例如,如果使用 Windows API CreateFile,两个应用程序都可能需要指定FILE_SHARE_READFILE_SHARE_WRITE. 这将允许两个(多个)应用程序“同时”读取和写入文件。

但是,除了共享文件之外,还需要协调应用程序之间的操作。您将需要使用某种锁定机制(通过锁定文件的某些部分或某些共享互斥体/信号量)。请注意,如果您使用文件锁定,您可以锁定文件中的一些已知偏移量以充当“信号量”(它甚至可以是超出文件物理结尾的字节值)。如果一个应用程序在另一个应用程序截断文件的同时附加到文件,那么这将导致不可预知的结果。

回到关于两个应用程序需要相互了解的评论......如果两个应用程序都以独占方式打开文件并不断重试操作直到成功,然后执行操作,然后关闭文件,它基本上会允许他们在彼此不“了解”的情况下工作。但是,这可能不会很好,也不是很有效。

说了这么多,出于效率原因,您可能需要考虑替代方案。例如,如果可以让写入应用程序定期写入新文件,那么它可能比必须不断地将数据从一个文件“移动”到另一个文件更有效。此外,如果您需要维护文件的某些部分(例如,将前 100 MB 移出到另一个文件,然后将第二个 100 MB 移到开头),这也可能是一项相当昂贵的操作。

于 2012-05-12T13:48:51.793 回答
0

logrotate 将是一个不错的选择是 linux,几乎任何发行版都有库存。我确定某处有类似的 Windows 服务

于 2012-05-12T14:42:12.387 回答