【发布时间】:2013-12-09 21:32:47
【问题描述】:
所以我有一个 Samba 文件服务器,我的 Java 应用程序需要在其上写入一些文件。问题是还有另一个 php 应用程序(如果一个 php 脚本甚至被认为是一个应用程序)正在积极地为新文件拉取相同的目录。
有时,php 脚本会在我的 Java 应用程序完成将文件完全写入磁盘之前提取文件。这里有一点 ascii 艺术,可以帮助可视化我目前拥有的东西(但不起作用):
Samba 分享
/foo(我的 java 应用程序将文件放在这里)
/bar(php拉取的目录)
我目前正在做的是当文件满足某些条件时,它被移动到/bar,然后被 php 拾取以进行更多处理。我尝试了不同的方法,例如在调用 renameTo 之前将文件设置为不可写和不可读。
我看了一点FileLocks,但它似乎无法锁定未来的文件。所以我想知道我在这里有什么样的可能性?我可以用什么来锁定文件在它完全写入之前被拾取而不接触 php(因为,好吧,它是 php,我现在没有权利修改它)。
谢谢
编辑 1
如果 php 脚本能以任何方式提供帮助,我对它的实际作用有了一些了解。
它正在循环读取目录文件(使用readdir 而不休眠)。
一旦找到“.”以外的文件名和“..”,它调用file_get_contents,这就是它失败的地方,因为文件没有完全写入磁盘(或者甚至没有,因为Java代码甚至可能没有时间在readdir和@987654330之间写入它@。
编辑 2
此 Java 应用程序正在替换旧的 php 脚本。当他们实施它时,他们遇到了我现在遇到的同样问题。他们通过在/bar/tmp(和file_put_contents)中写入新文件来解决它,然后使用rename 将其移动到bar(看起来重命名应该是原子的)。到目前为止,它一直运行良好。我不能也不会相信 Java 不能比 php 做得更好......
【问题讨论】:
-
/foo 和 /bar 是否在同一个文件系统上?
标签: java file locking file-locking