截断锁定的文件

时间:2016-12-19 13:21:35

标签: java windows file-locking

即使我将文件锁定在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);

我怎么敢!

问题:为什么实际上要将内容写入文件禁止但将其截断为允许的大小为零?这种文件锁的目的是什么?

1 个答案:

答案 0 :(得分:1)

这种有点奇怪的看似行为也在Linux / Unix上 - 与语言无关。

锁定已经打开的文件的意思是锁定特定的字节范围,但不锁定文件。在协作软件中,您可以在其他进程/线程中首先尝试在以追加模式("ab")或读取+写入模式("rb+")打开后立即获得相同类型的锁定 - 而不是{{ 1}},只有当你获得锁定时才进行"wb"

但是,如果您只想在Windows上将share-access级别的整个文件锁定而不是执行字节范围锁,那么只需在开始时执行类似的操作即可阅读文件

seek(0); truncate(0); write(...)

(使用CreateFile的Python示例;它是一个读取共享锁定,它只是在读取期间阻止其他写入;使用&#34; 0&#34;而不是FILE_SHARE_READ来完全锁定读取,或者开放写作)