Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 截断锁定文件_Java_Windows_File Locking - Fatal编程技术网

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 } 令人惊讶的是,这些行通过后,文件将被打开,并且由于它存在,它将被愉快地截断为零大小 但是,

即使我在Java程序中锁定了一个文件

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)