Java 截断锁定文件
即使我在Java程序中锁定了一个文件Java 截断锁定文件,java,windows,file-locking,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 } 令人惊讶的是,这些行通过后,文件将被打开,并且由于它存在,它将被愉快地截断为零大小 但是,
try (FileChannel channel = FileChannel.open(fileName, StandardOpenOption.READ);
FileLock lock = channel.lock(0, Long.MAX_VALUE, false)) {
// ... <-- Program waits here
}
令人惊讶的是,这些行通过后,文件将被打开,并且由于它存在,它将被愉快地截断为零大小
但是,我不允许实际向其写入内容:
assert(fwrite("foo", 1, 3, file) == 3);
assert(fflush(file) == 0);
我怎么敢
问题:为什么实际上禁止向文件写入内容,但允许将其截断为零大小?这样一个文件锁的目的是什么?这种看起来有些奇怪的行为在Linux/Unix上也是如此——与语言无关 锁定已打开的文件的意思是锁定特定的字节范围,而不是锁定文件本身。在协作软件中,您可以在另一个进程/线程中首先尝试在附加模式(
“ab”
)或读写模式(“rb+”
)打开后获得相同类型的锁,而不是“wb”
,只有在获得锁后才执行搜索(0);截断(0);写入(…)
但是,如果您只是想在Windows的级别上锁定整个文件,而不是执行字节范围锁定,那么在打开文件进行读取时,只需在开始时执行如下操作:
fh = win32file.CreateFile(path, win32file.GENERIC_READ, win32file.FILE_SHARE_READ, None,
win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)
(Python示例使用;它是一个读取共享锁定,在读取期间只会阻止其他写入;使用“0”而不是“文件共享”读取,以获得针对读取的总锁定,或者在打开以进行写入时)
fh = win32file.CreateFile(path, win32file.GENERIC_READ, win32file.FILE_SHARE_READ, None,
win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)