小编Dav*_*vid的帖子

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

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

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));
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

更新:

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

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

java file-io

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

file-io ×1

java ×1