文件锁定和删除

6

我正在用Java编写一个监控并备份目录的程序。时不时地,我需要将修改后的文件上传到代码库中,或者下载新版本的文件。 为了实现这一点,我需要锁定文件,以便用户无法更改其内容或删除它。 目前,我正在使用以下代码来锁定文件:

        file = new RandomAccessFile("C:\\Temp\\report.txt", "rw");

        FileChannel fileChannel = file.getChannel();
        fileLock = fileChannel.tryLock();
        if (fileLock != null) {
            System.out.println("File is locked");

            try{

            //Do what i need    

            }catch (Exception e){//Catch exception if any
                System.err.println("Error: " + e.getMessage());
            }
        }
        else{
            System.out.println("Failed");
        }
    } catch (FileNotFoundException e) {
        System.out.println("Failed");
    }finally{
        if (fileLock != null){
            fileLock.release();
        }

然而,如果出现了新版本,我就必须删除旧文件并替换为新文件。但是文件锁不允许我删除该文件。

我应该立即解锁和删除它,相信用户不会在该文件中写入任何内容吗?还是有其他方法可以做到这一点?


1
无论如何这都不起作用。文件锁定并不能阻止用户更改或删除文件,它们只能防止其他程序锁定该文件。 - user207421
1个回答

3
你可以截断文件:
fileChannel.truncate(0);

之后,写入新版本时,这将不会创建用户可以再次创建文件的时间间隔。

来自文档:

如果给定大小小于文件的当前大小,则截断文件,丢弃超出文件新结尾的任何字节。如果给定大小大于或等于文件的当前大小,则不修改该文件。无论哪种情况,如果此通道的文件位置大于给定大小,则将其设置为该大小。

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate%28long%29


除非我没有理解全局,否则这只会擦除文件的内容。所以这不是我需要的。 - user1308768
我应该立即解锁和删除它,相信用户不会在文件中写入吗?还是有其他方法可以做到这一点?我回答说,在文件锁定后使用截断(truncate)可以清除内容并在其上写入新内容,因此您不需要在删除文件和创建基于要同步的文件的新文件之间存在时间差。 - Francisco Spaeth
我只是添加了一些额外的解释... 如果您需要更多澄清,请告诉我。 - Francisco Spaeth
啊,好的。这确实是一个解决方案。我想到的是移动操作(http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#move%28java.nio.file.Path,%20java.nio.file.Path,%20java.nio.file.CopyOption...%29),因为它比复制文件内容更快。但到目前为止,你提供的是最好的解决方案。 - user1308768

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接