7

ローカル マスター ファイルを開き、追加を行い、マスター ファイルを上書きし、アクセス可能なネットワーク上の場所にある書き込み保護されたコピーを上書きすることにより、ファイルを保存するように設計されたコードがあります。これは、変更されたファイルを一時ファイルに保存してから、他の 2 つのファイルをコピーすることによって行われます。

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 例外がスローされ、ファイルが削除されることがあるようです。

これは setWritable() または Files.copy (またはその組み合わせ) のバグに違いないと思います。ファイルはどのような場合でも削除されるべきではなく、isWritable() は毎回 true を返すためです。読み取り専用アクセス許可を設定/設定解除するために他の方法を試しましたが、空になりました。私が実施している現在の回避策は、単に例外をキャッチし、ファイルが削除されて新しいコピーが配置されるまでループします。これは機能しますが、実際にはハックであるため、より良い解決策/提案があれば歓迎します.

4

1 に答える 1