gpt4 book ai didi

Java Files.copy 完全替换现有的删除文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:38:11 25 4
gpt4 key购买 nike

我有一些代码旨在通过覆盖主文件和覆盖可访问网络位置上的写保护副本来打开本地主文件、进行添加和保存文件。这是通过将修改后的文件保存到临时文件然后复制其他两个文件来完成的。

String tempFileName= "File.tmp";
String fileName= "File.xlsm";
String serverPath="\\\\network path\\";
File serverFile = new File(serverPath+fileName);

Files.copy(Paths.get(tempFileName),Paths.get(fileName),
StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING);

if(serverFile.exists()){serverFile.setWritable(true, false);}

Files.copy(Paths.get(tempFileName),Paths.get(serverPath+fileName),
StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING);

serverFile.setWritable(false,false);

Files.delete(Paths.get(tempFileName));

此代码在大多数情况下都运行良好,但有时代码会无一异常(exception)地成功完成,但会删除网络位置文件。本地主文件已正确保存和更新,但网络上应存在的文件却不见了。

让这变得更加困难的是我无法在任何受控情况下重现此问题。因此,我请求您提供有关文件复制/覆盖操作如何发生这种情况的任何指导。

谢谢

更新:

我有预感并检查了服务器文件路径的网络访问日志。当且仅当创建者以外的用户正在访问文件时(但并非始终如此),才会删除文件。不过,这再次以只读方式访问,因此打开文件的用户不应该影响覆盖新版本,而且大多数情况下不会。更深入地挖掘似乎偶尔当且仅当文件被另一个用户打开并且 java 试图覆盖文件时抛出 AccessDenied 异常并删除文件。

我相信这一定是 setWritable() 或 Files.copy(或组合)中的错误,因为在任何情况下都不应删除该文件,并且 isWritable() 每次都会返回 true。我已经尝试了其他方法来设置/取消设置只读权限,但结果是空的。我现有的当前解决方法只是捕获异常并循环,直到文件被删除并且新副本就位。这行得通,但实际上是一个 hack,所以如果有人有任何更好的解决方案/建议,我欢迎他们。

最佳答案

参见 How does FileLock work? ,你可以这样做:

  1. 等待文件可用
  2. 锁定文件
  3. 覆盖/删除/其他
  4. 解锁(如果适用)

这应该可以防止其他用户在修改文件的过程中访问。

关于Java Files.copy 完全替换现有的删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com