3

在进行了大量研究后,也无法找到解决我的问题的方法,我决定在 stackoverflow 上发布。

好吧,我的问题有点不寻常,所以我想这就是我找不到任何答案的原因:

我有一个程序将内容记录到文件中。然后我有另一个负责传输该文件。最后我有第三个获取文件并处理它。

我的问题是:文件传输程序需要在文件仍在录制时发送文件。问题是,当文件传输程序到达文件末尾时,并不意味着文件实际上是完整的,因为它仍在记录中。

最好有一些东西来检查记录器是否仍然打开该文件,或者它是否已经关闭,以便能够判断文件末尾是否实际上是文件的真正结尾,或者是否根本没有进一步的数据还没读完。

希望你能帮我解决这个问题。也许你对如何解决这个问题有另一个想法。

先感谢您。

杰科德

4

5 回答 5

1

简单地说——你不能不使用文件系统通知机制,windows、linux 和 osx 都有这种风格。我忘记了 Windows 是如何做到这一点的,但 linux 有“inotify”,而 osx 有“knotify”。

处理此问题的简单方法是,录制到 tmp 文件,录制完成后将文件移动到“准备传输文件”目录中,如果您这样做是为了使文件在同一当您进行移动时,文件系统将是原子的且即时的,以确保您的传输实用程序“看到”一个新文件时,它将完全形成并准备就绪。

或者,只是让您的 tmp 文件没有扩展名,然后在完成后将文件重命名为传输代理轮询的扩展名。

于 2012-01-05T09:52:27.390 回答
0

您可以检查文件是否打开,如下所示

FILE_NAME="filename"
FILE_OPEN=`lsof | grep $FILE_NAME`

// if [ -z $FILE_NAME ] ;then
   // "File NOT open"
// else
    // "File Open"

参考http://linux.about.com/library/cmd/blcmdl8_lsof.htm

于 2012-01-05T09:56:38.413 回答
0

您是否考虑过在记录器程序和抓取记录数据/文件的程序之间使用流接口?如果您有权访问还提供可靠的流信号/原语结束的流接口(例如操作系统/堆栈服务),您可以考虑替换文件接口。

于 2012-01-05T09:54:17.233 回答
0

C 中没有可用的函数/库来执行此操作。但一个简单的替代方法是在活动结束后重命名文件。例如,记录器可以使用名称打开文件 -file.record一旦完成记录,它可以重命名file.recordfile.transfer,传输程序应该寻找file.transfer传输,一旦传输完成,它可以将文件重命名为file.read并且读者可以读取最后将其重命名为file.done!

于 2012-01-05T09:55:41.827 回答
0

我认为咨询锁会有所帮助。因为如果一个人使用另一个程序正在处理的文件,这个文件将被阻止或出错。但是如果你强制访问它,动作是Okey,但结果是不可预知的,为了保持一致性,所有想要访问文件的进程都应该遵守咨询锁规则。我认为这会奏效。

当文件关闭时,锁也会被释放。其他进程可以尝试持有文件。

于 2012-01-05T10:08:58.443 回答