Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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_File_Locking_Delete File - Fatal编程技术网

Java 文件锁定和删除

Java 文件锁定和删除,java,file,locking,delete-file,Java,File,Locking,Delete File,我正在用java编写一个程序,用于监视和备份目录。有时,我不得不将修改过的文件上传到存储库中,如果有新版本的文件,也可以下载。 为了做到这一点,我必须锁定文件,以便用户无法更改内容或删除它。 目前我正在使用以下代码锁定文件: file = new RandomAccessFile("C:\\Temp\\report.txt", "rw"); FileChannel fileChannel = file.getChannel(); fileLock

我正在用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();
        }
fileChannel.truncate(0);
但是,如果有新版本,我必须删除旧文件并替换为新文件。 但是文件锁不允许我删除该文件


我是否应该解锁并删除它并写下来,相信用户不会在文件中写入?或者还有其他方法吗?

您可以截断文件:

        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();
        }
fileChannel.truncate(0);
然后在上面写下新版本,这样就不会产生用户可以再次创建文件的时间间隔

从文件:

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


除非我忽略了全局,否则这只会删除文件的内容。所以这不是我所需要的。我是否应该解锁并删除它并写下来,相信用户不会在文件中写入?或者还有其他的方法吗?我的回答是truncate,您可以在文件锁定后使用它清除内容并在其上写入新内容,这样您就不会在删除文件和基于要同步的文件创建新文件之间有时间间隔。我只是添加了一些额外的说明。。。如果你需要更多的澄清,请告诉我。这确实是一个解决办法。我想到的是move操作(),因为它比复制文件内容更快。但直到现在,你才知道这是最好的解决方案,无论如何,这是行不通的。文件锁不会阻止用户更改或删除文件。它们仅阻止其他程序锁定该文件。