Hallo,
ich habe in meiner Java Anwedung mit dem JavaTar API eine Methode, um .tar bzw. in Kombination mit GZip .tar.gz Archive zu erstellen. Diese Methode funktioniert auch soweit, jedoch sind die resultierenden Archive für WinRar ungültig, während 7Zip und auch der Ubuntu Archivmanager das Archiv anstandslos öffnet.
7Zip meldet folgendes:
Sourcecode der Methoden(es ist eine Utility Klasse):
Von außen aufgerufen wird dann die createTar Methode aufgerufen. Es funktioniert auch alles so wie es soll, nur ist eben das Ausgabearchiv für WinRar ungültig.
Ich würde mich sehr über eine Erklärung für dieses merkwürdige Problem freuen.
Gruß,
Hawkes
ich habe in meiner Java Anwedung mit dem JavaTar API eine Methode, um .tar bzw. in Kombination mit GZip .tar.gz Archive zu erstellen. Diese Methode funktioniert auch soweit, jedoch sind die resultierenden Archive für WinRar ungültig, während 7Zip und auch der Ubuntu Archivmanager das Archiv anstandslos öffnet.
7Zip meldet folgendes:
Code:
7-Zip 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06
p7zip Version 4.57 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Processing archive: testpackage.tar.gz
Testing testpackage.tar
Everything is Ok
Size: 102400
Compressed: 12947
Sourcecode der Methoden(es ist eine Utility Klasse):
Code:
/**
* Returns a tar stream that can be used for generating archives
*
* @param outfile
* @return TarOutputStream
*/
private static TarOutputStream getPackageStream(String outfile) throws FileNotFoundException {
TarOutputStream out = null;
FileOutputStream stream = null;
File archiveFile = new File(outfile);
stream = new FileOutputStream(archiveFile);
out = new TarOutputStream(stream);
return out;
}
/**
* Writes a file to a given output stream
*
* @param out The tar stream
* @param file the file
* @param tmpName The name of the temporary directory
*/
private static void writeFileToArchive(TarOutputStream out, File file, String tmpName) throws IOException {
TarEntry tarAdd = new TarEntry(file);
if(file == null || file.exists() == false) return;
if (tarAdd.isDirectory()) {
TarEntry[] entries = tarAdd.getDirectoryEntries();
for (TarEntry entry : entries) {
FileUtil.writeFileToArchive(out, entry.getFile(), tmpName);
}
}
tarAdd.setModTime(file.lastModified());
String name = tarAdd.getName();
if (tmpName.charAt(0) == '/') {
name = name.replaceFirst(tmpName.substring(1), "");
} else {
name = name.replaceFirst(tmpName, "");
}
tarAdd.setName(name);
out.putNextEntry(tarAdd);
if (!tarAdd.isDirectory()) {
FileInputStream in = new FileInputStream(file);
while (true) {
int nRead = in.read(buffer, 0, buffer.length);
if (nRead <= 0) {
break;
}
out.write(buffer, 0, nRead);
}
in.close();
}
out.closeEntry();
}
public static File createTar(String filename, File buildDir) throws IOException {
File[] subBuildDirs = buildDir.listFiles();
TarOutputStream tarStream = FileUtil.getPackageStream(filename);
for (File subBuildDir : subBuildDirs) {
FileUtil.writeFileToArchive(tarStream, subBuildDir, buildDir.getAbsolutePath());
}
tarStream.close();
return new File(filename);
}
Von außen aufgerufen wird dann die createTar Methode aufgerufen. Es funktioniert auch alles so wie es soll, nur ist eben das Ausgabearchiv für WinRar ungültig.
Ich würde mich sehr über eine Erklärung für dieses merkwürdige Problem freuen.
Gruß,
Hawkes