即使我将文件锁定在Java程序中
try (FileChannel channel = FileChannel.open(fileName, StandardOpenOption.READ);
FileLock lock = channel.lock(0, Long.MAX_VALUE, false)) {
// ... <-- Program waits here
}
我被允许在像这样的C程序中使用写访问权打开这个文件
FILE *file = fopen(filename, "wb");
assert(file != NULL);
令人惊讶的是,这些行通过,文件将被打开,因为它存在,它将被愉快地截断为零大小。
但我不允许实际写内容:
assert(fwrite("foo", 1, 3, file) == 3);
assert(fflush(file) == 0);
我怎么敢!
问题:为什么实际上要将内容写入文件禁止但将其截断为允许的大小为零?这种文件锁的目的是什么?
答案 0 :(得分:1)
这种有点奇怪的看似行为也在Linux / Unix上 - 与语言无关。
锁定已经打开的文件的意思是锁定特定的字节范围,但不锁定文件。在协作软件中,您可以在其他进程/线程中首先尝试在以追加模式("ab"
)或读取+写入模式("rb+"
)打开后立即获得相同类型的锁定 - 而不是{{ 1}},只有当你获得锁定时才进行"wb"
但是,如果您只想在Windows上将share-access级别的整个文件锁定而不是执行字节范围锁,那么只需在开始时执行类似的操作即可阅读文件:
seek(0); truncate(0); write(...)
(使用CreateFile的Python示例;它是一个读取共享锁定,它只是在读取期间阻止其他写入;使用&#34; 0&#34;而不是FILE_SHARE_READ来完全锁定读取,或者开放写作)