我有一些代码旨在通过覆盖主文件和覆盖可访问网络位置上的写保护副本来打开本地主文件、进行添加和保存文件。这是通过将修改后的文件保存到临时文件然后复制其他两个文件来完成的。
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。我尝试了其他设置/取消设置只读权限的方法,但结果为空。我现有的解决方法只是捕获异常并循环,直到文件被删除并且新副本就位。这可行,但实际上是一个黑客,所以如果有人有更好的解决方案/建议,我欢迎他们。