繁体   English   中英

检查另一个程序是否打开了文件

[英]Check if another program has a file open

经过大量的研究,也无法找到我的问题的解决方案,我决定在这里发布stackoverflow。

好吧,我的问题有点不寻常,所以我猜这就是为什么我找不到任何答案:

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

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

如果记录器的文件仍然打开,或者它已经关闭它以便能够判断文件的末尾是否真的是文件的结尾,或者是否根本没有进一步的数据,这将是一件好事。要读了

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

先感谢您。

GeKod

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

处理这个的简单方法是,记录到tmp文件,当记录完成后,将文件移动到“准备传输文件”目录,如果这样做,那么文件是相同的文件系统当你进行移动时,它将是原子的,并且是即时的,确保你的传输实用程序“看到”一个新文件时,它将完全形成并准备就绪。

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

您是否考虑过在录像机程序和抓取录制数据/文件的程序之间使用流接口? 如果您可以访问流接口(比如OS /堆栈服务),它也提供了可靠的流信号/基元结束,您可以考虑更换文件接口。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM