2012-01-05 81 views
3

经过大量研究,也无法找到我的问题的解决方案后,我决定在这里发布stackoverflow。检查另一个程序是否有文件打开

那么我的问题是一种不同寻常的,所以我想这就是为什么我无法找到任何答案:

我有一个程序,被记录的东西到一个文件中。然后我有另一个负责转移该文件的人。最后,我有第三个获取文件并对其进行处理。

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

这将是很高兴有一些东西来检查,如果记录器仍然打开文件,或者如果它已经关闭它可以判断文件的结尾是否真的是文件的真正结束,还是只是没有'还有待读的数据。

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

预先感谢您。

GeKod

+0

也许'inotify'?它可以在文件关闭时通知您。 – cha0site 2012-01-05 09:50:41

+0

similar/duplicate - http://stackoverflow.com/questions/1087204/how-can-i-tell-if-a-file-is-open-elsewhere-in-c-on-linux – 2012-01-05 09:56:34

+0

你可以修改作者的来源? – alk 2012-01-05 10:03:56

回答

1

简单地说 - 你不能没有使用文件系统通知机制,Windows,Linux和OSX都有这种味道。我忘记了Windows如何做到了,但是linux有'inotify',而osx有'knotify'。

处理这个问题的简单方法是,记录到一个tmp文件,当记录完成后,将文件移动到'准备传输文件'目录中,如果你这样做,以便文件当你做这个动作的时候,它们是在同一个文件系统上,它将是原子性的并且可以即时确保你的传输实用程序“看到”一个新文件时,它将完全形成并准备就绪。

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

+0

嗨,谢谢你的回复。简单的方法不适用于我我认为问题是文件需要在记录时传输。我不能等到文件完整记录才能发送。 – gekod 2012-01-05 10:02:16

+0

*通知家族中的某个东西可能是您最好的选择 - 否则您必须轮询更改,并在文件完成时出现某种超时情况,我相信您已经考虑过这种情况。 – synthesizerpatel 2012-01-05 10:25:09

+0

是的,我其实已经考虑过轮询文件大小的变化,但它似乎并不是一个干净的解决方案。再次感谢:) – gekod 2012-01-05 10:29:34

0

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

0

C中没有可用的函数/库来执行此操作。但是一个简单的选择是在活动结束后重命名文件。例如,记录仪可以打开该文件的名称 - file.record一次带录制完成,它可以重命名file.recordfile.transfer和传输程序应该寻找file.transfer转移,一旦转让完成,就可以将文件重命名为file.read和读者可以阅读并最终将其重命名为file.done

+0

感谢您的回答。正如已经提到的,我不能等到文件完整记录。记录和传送需要同时进行。 – gekod 2012-01-05 10:03:55

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

+0

这需要数小时 – 2012-10-25 12:08:57

0

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

当文件关闭时,锁也被释放。其他进程可以尝试保存该文件。

相关问题