【问题标题】:Truncate locked file截断锁定的文件
【发布时间】:2016-12-19 13:21:34
【问题描述】:

即使我在 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);

我怎么敢!

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

【问题讨论】:

    标签: java windows file-locking


    【解决方案1】:

    这种看起来有些奇怪的行为也出现在 Linux / Unix 上 - 与语言无关。

    锁定已打开文件的含义是锁定特定字节范围,而不是锁定文件本身。在协作软件中,您可以在其他进程/线程中首先尝试在以附加模式("ab")或读写模式("rb+")打开后立即获得相同类型的锁 - 而不是"wb",并且仅那么当你拿到锁时,做一个seek(0); truncate(0); write(...)

    但是,如果您只是想在 Windows 上将整个文件锁定在 share-access 级别而不是执行 byte-range locks ,那么只需在打开 文件供阅读:

    fh = win32file.CreateFile(path, win32file.GENERIC_READ, win32file.FILE_SHARE_READ, None, 
                              win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
    

    (使用CreateFile 的Python 示例;它是一个读共享锁定,它只会在读取期间阻止其他写入;使用“0”而不是FILE_SHARE_READ 来完全锁定以防止读取或打开以进行写入)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 2012-08-08
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多