当我想删除文件时,我应该锁定它吗?

Posted

技术标签:

【中文标题】当我想删除文件时,我应该锁定它吗?【英文标题】:Should I have a lock on a file when I want to delete it? 【发布时间】:2019-04-03 12:15:20 【问题描述】:

我在本地文件系统上有一堆文件。我的服务器将提供这些文件。在某些情况下,服务器会收到删除文件的指令。 目前我正在使用FileChannel.lock() 来获取文件的锁定,这主要是为了确保在我尝试删除文件时其他进程没有编辑该文件。 如果我成功获取了锁,我可以直接删除文件,还是需要先释放锁? 像这样:

FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared())
    Path filePath = Paths.get(file.getPath());
    Files.delete(filePath);

删除文件后是否需要解除锁定?

还是应该是这样(lock.release() 已添加):

FileOutputStream out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if(lock.isValid() && !lock.isShared())
    lock.release();
    Path filePath = Paths.get(file.getPath());
    Files.delete(filePath);

编辑: 所以事实证明上面的代码无论如何都行不通,因为你不能用FileInputStream 修改文件,因为它当然是只读的。我已经修改了上面的代码以使用FileOutputStream 代替,但它仍然不能正常工作,因为即使我从通道中释放了锁,file 对象仍然有锁。所以我像这样修改了代码:

FileOutputStream out = new FileOutputStream(file);
                    FileChannel channel = out.getChannel();
                    FileLock lock = channel.lock();
                    if(lock.isValid() && !lock.isShared())
                        channel.close();
                        boolean deleted = file.delete();
                        logger.info(" @ File  deleted: ", id, type, file.getName(), deleted);
                    

这似乎按预期工作。我仍然想知道这是否安全,或者是否有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

删除文件时文件锁定不起作用。文件锁定仅在其他一些进程想要编辑同一文件时才起作用。删除文件前,需要先解除锁定,关闭频道

【讨论】:

好吧,你能快速看看我的编辑。原来channel.close() 也释放了锁。

以上是关于当我想删除文件时,我应该锁定它吗?的主要内容,如果未能解决你的问题,请参考以下文章

该项目已过时[重复]

如何删除 Access Db 的临时 ldb 文件

当我单击我的 apk 文件并显示修改或删除 USB 存储的内容时,安装按钮显示为禁用

如何强制删除 C/C++ 中的锁定文件?

MySQL中的额外列,我可以删除它吗?

删除被进程访问而锁定的文件