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

时间:2013-03-08 18:34:37

标签: java file-io

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

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));

此代码在大多数情况下运行良好,但有时代码成功完成但没有异常但删除了网络位置文件。本地主文件已正确保存和更新,但网络上应该存在的文件已经消失。

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

谢谢

更新:

我有预感并检查了网络访问日志到服务器文件路径。当且仅当文件由创建者以外的用户访问时才会删除文件,但不是所有时间都是如此。但同样,这是以只读方式访问的,因此打开文件的用户不应该影响覆盖新版本,大多数情况下不会。深入挖掘它似乎偶尔,当且仅当文件被另一个用户打开并且java试图覆盖该文件时,抛出AccessDenied Exception并删除该文件。

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

1 个答案:

答案 0 :(得分:-2)

请参阅How does FileLock work?,您可以执行以下操作:

  1. 等待文件可用
  2. 锁定文件
  3. 改写/删除/其他
  4. 解锁(如果适用)
  5. 这会阻止其他用户在修改文件的过程中进行访问。