ディレクトリの内容を圧縮していますが、圧縮されたファイルを開くときにエラーが発生します。Javaユーティリティzipで「破損」zipファイルが作成される
私のコードで何が起こっているのか誰にでも教えてください。おそらく私は十分なバイトを割り当てていないでしょうか?
zipDirectory()を見ると、特別な拡張子ファイルを含むフォルダを圧縮していることがわかります。
どこにエラーが発生しているのかわからないので、誰かが私を助けてくれるかもしれません! IOとほとんどの問題と同様に
感謝
private void zipDirectory() {
File lazyDirectory = new File(defaultSaveLocation);
File[] files = lazyDirectory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Zipping up " + file);
zipContents(file);
}
}
}
public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException {
System.out.println("Writing '" + fileName + "' to zip file");
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
fis.close();
}
public static void zipContents(File dirToZip) {
List<File> fileList = new ArrayList<File>();
File[] filesToZip = dirToZip.listFiles();
for (File zipThis : filesToZip) {
String ext = "";
int i = zipThis.toString().lastIndexOf('.');
if (i > 0) {
ext = zipThis.toString().substring(i+1);
}
if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){
fileList.add(zipThis);
}
}
try {
FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
for (File file : fileList) {
addToZip(file.toString(), zos);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
最後にzos.close()を実行するべきではありませんか? – Piovezan
私はこのことについても心配しています: 'file.toString()'。これは、そのパスを使ってzipファイルに "C:\ some \ dir \ some \ where \ file.ext"というファイルを追加することを示します。つまり、解凍すると、このEXACTの場所に解凍されます。元のトップレベルのパス(ルート親のトリム)に基づいて相対パスを構築してみることをお勧めします) – MadProgrammer
これは標準のjava utilsで動作することは決してありませんでした。 Apache Commons Compressでドロップする(そしていくつかのアーカイブクロージャコールを追加する)ことは私のためにこれを解決しました。また、バッファリングされたリーダー/ライターで入出力ストリームをラップするようにしてください。 – Amalgovinus