我想检查每一分钟是否有生成类似“RESULTS.ODB”的文件,如果此文件大于1.5千兆字节,则启动另一个子进程以从此文件获取数据。我怎样才能确保文件没有正在编写并且包含所有内容?
我希望你知道我的意思。任何想法如何处理?
非常感谢你。 :)
答案 0 :(得分:0)
如果你无法控制写作过程,那么你在某个地方肯定会失败。
如果您确实可以控制作者,那么可以通过一种简单的方式来锁定#34;文件是创建符号链接。如果符号链接创建失败,则表示正在进行写入。如果成功,你就获得了锁定"。
但是如果你对编写和创建文件没有任何控制权,那就会有麻烦。您可以尝试这里概述的方法:Ensuring that my program is not doing a concurrent file write
这将读取文件的时间戳和" guess"如果写作已经完成,则来自他们。这比检查文件大小更可靠,因为您可能最终得到的文件超过了您的大小阈值,但仍在进行中。
在这种情况下,问题是作者在您完整阅读文件之前开始编写。现在,当读取的文件中途消失时,读者会失败。
如果你在Unix平台上,你无法控制写作,你绝对需要这样做,我会做这样的事情:
然而,这最终会失败,你将失去更新,因为没有办法使这个原子。重命名将删除在读取文件之前覆盖文件的问题,但如果编写者决定在1和2之间开始编写,您不仅会收到一个不完整的文件,但如果它不喜欢该文件,您也可能会破坏该文件消失了一半。
我宁愿尝试找到一种将动作链接在一起的方法。您的编写器触发读取过程或添加锁定机制。写入1.5GB的数据并不是即时的,最终会发生意外情况。
或者,如果你绝对不能做那样的事情,你能否确保你的作家在N分钟内写出最多一次?如果您确定它永远不会在5分钟的窗口内写入两次,您将在读取器中等待,直到该文件为3分钟,然后重命名并读取重命名的文件。您还可以检查是否可以阻止编写器覆盖。如果你能做到这一点,那么你可以安全地处理你的阅读器中的文件,当它已经足够大了#34;并且在您决定给予它的任何宽限期内没有改变,当您阅读它时,您将删除该文件以允许出现下一个更新。
在不了解您的环境和流程的情况下,这是我能想到的最好的。但是这个问题没有普遍的解决方案。它需要针对您的特定环境量身定制的解决方法。