Например, я хочу архивировать файл, хранивший в /Users/me/Desktop/image.jpg
Я сделал этот метод:
public static Boolean generateZipFile(ArrayList<String> sourcesFilenames, String destinationDir, String zipFilename){
// Create a buffer for reading the files
byte[] buf = new byte[1024];
try {
// VER SI HAY QUE CREAR EL ROOT PATH
boolean result = (new File(destinationDir)).mkdirs();
String zipFullFilename = destinationDir + "/" + zipFilename ;
System.out.println(result);
// Create the ZIP file
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename));
// Compress the files
for (String filename: sourcesFilenames) {
FileInputStream in = new FileInputStream(filename);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filename));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
} // Complete the ZIP file
out.close();
return true;
} catch (IOException e) {
return false;
}
}
Но когда я извлекаю файл, разархивированные файлы имеют полный путь.
Я не хочу полного пути каждого файла в zip, я только хочу имя файла.
Как может, я сделал это?
Здесь:
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filename));
Вы создаете запись для этого файла, используя полный путь. Если вы просто используете имя (без пути), у вас будет то, что вам нужно:
// Add ZIP entry to output stream.
File file = new File(filename); //"Users/you/image.jpg"
out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg"
Вы находите свои исходные данные, используя относительный путь к файлу, а затем устанавливаете то же самое для Entry. Вместо этого вы должны превратить источник в объект File, а затем использовать
putNextEntry (new ZipEntry (sourceFile.getName ()))
, который даст вам только последнюю часть пути (т.е. фактический файл имя)
Вы, вероятно, могли уйти с доступом к исходным файлам через новый FileInputStream (новый файл (sourceFilePath, sourceFileName)).
Выполните , как сказал Джейсон , или, если вы хотите сохранить подпись метода, сделайте это следующим образом:
out.putNextEntry(new ZipEntry(new File(filename).getName()));
или, используя FileNameUtils.getName из Apache Commons / io:
out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename)));