我有一些代码旨在打开本地主文件,进行添加,并通过覆盖主文件和覆盖可访问网络位置上的写保护副本来保存文件。这是通过将修改后的文件保存到临时文件,然后复制其他两个文件来完成的。
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));
此代码在大多数情况下运行良好,但有时代码会毫无例外地成功完成,但会删除网络位置文件。本地主文件已正确保存和更新,但应存在于网络上的文件却消失了。
使这变得更加困难的是我无法在任何受控情况下重现这个问题。因此,我请求您提供有关文件复制/覆盖操作如何发生这种情况的任何指导。
谢谢
UPDATE:
我有预感并检查了服务器文件路径的网络访问日志。当且仅当文件被创建者以外的用户访问时才会删除文件,但并非始终如此。但同样,这是以只读方式访问的,因此打开文件的用户不会影响覆盖新版本,而且大多数情况下不会。深入挖掘,似乎偶尔当且仅当该文件被另一个用户打开并且 java 试图覆盖该文件时,才会抛出 AccessDenied 异常并删除该文件。
我相信这一定是 setWritable() 或 Files.copy (或组合)中的错误,因为在任何情况下都不应删除该文件,并且 isWritable() 每次都返回 true。我尝试过其他设置/取消设置只读权限的方法,但结果为空。我目前所做的工作只是捕获异常并循环,直到文件被删除并有新的副本就位。这是有效的,但实际上是一个黑客,所以如果有人有任何更好的解决方案/建议,我欢迎他们。