次のことを行うJavaコードがあります。
- を使用して、拡張子が ZIP の空の一時ファイルを作成します。
File.createTempFile()
- で削除します
File.delete()
(一時ファイル名を生成するだけでした) - 同じファイル名
com.google.commons.io.ByteStreams.copy()
の newを使用して、「テンプレート」ZIP ファイルを同じパスにコピーします。OutputSupplier
- TrueZIP 7.4.3 を使用して ZIP アーカイブを変更 (ディレクトリを削除)
特定のシステムでは、手順 4 が一貫して失敗しますFsReadOnlyArchiveFileSystemException - "This is a read-only archive file system!"
( http://java.net/projects/truezip/lists/users/archive/2011-05/message/9を参照) 。
TrueZIP コードをデバッグすると、次のことがわかりました。
- 上記のいずれかの手順の間、特に手順 4 の前では、このファイルには開いているファイル ハンドルはありません。
- NIO ではなく File.canWrite() で同じファイルを確認すると、(デバッガーを使用して) まったく同じタイミングで返され、書き込み可能であることが示されます。
デバッガ式のリストには次のように表示されます。
fn => "C:/myworkdir/temp/myfile4088293380313057223tmp.zip"
java.nio.file.Files.isWritable(java.nio.file.Paths.get(fn)) => false
new java.io.File(fn).canWrite() => true
JDK 1.7.04 の使用
何か案は?