Zip / komprimieren einen Ordner voller Dateien auf Android

Ich muss einen "Projekt" Ordner zip, um Benutzern zu ermöglichen, Projekte per E-Mail zu teilen. Ich fand eine Klasse für das Zippen von mehreren Dateien in einem Zip, aber ich muss die Ordner-Struktur in meinem Zip zu halten. Gibt es eine Möglichkeit, dies auf Android zu erreichen? Danke im Voraus.

4 Solutions collect form web for “Zip / komprimieren einen Ordner voller Dateien auf Android”

Dieser Code sollte den Trick machen.

Hinweis: Sie müssen Ihrer App eine Datei schreiben Berechtigungen hinzufügen, indem Sie die Datei WRITE_EXTERNAL_STORAGE zu Ihrer Datei manifest.xml hinzufügen.

/* * * Zips a file at a location and places the resulting zip file at the toLocation * Example: zipFileAtPath("downloads/myfolder", "downloads/myFolder.zip"); */ public boolean zipFileAtPath(String sourcePath, String toLocation) { final int BUFFER = 2048; File sourceFile = new File(sourcePath); try { BufferedInputStream origin = null; FileOutputStream dest = new FileOutputStream(toLocation); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( dest)); if (sourceFile.isDirectory()) { zipSubFolder(out, sourceFile, sourceFile.getParent().length()); } else { byte data[] = new byte[BUFFER]; FileInputStream fi = new FileInputStream(sourcePath); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath)); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } } out.close(); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /* * * Zips a subfolder * */ private void zipSubFolder(ZipOutputStream out, File folder, int basePathLength) throws IOException { final int BUFFER = 2048; File[] fileList = folder.listFiles(); BufferedInputStream origin = null; for (File file : fileList) { if (file.isDirectory()) { zipSubFolder(out, file, basePathLength); } else { byte data[] = new byte[BUFFER]; String unmodifiedFilePath = file.getPath(); String relativePath = unmodifiedFilePath .substring(basePathLength); FileInputStream fi = new FileInputStream(unmodifiedFilePath); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(relativePath); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } } } /* * gets the last path component * * Example: getLastPathComponent("downloads/example/fileToZip"); * Result: "fileToZip" */ public String getLastPathComponent(String filePath) { String[] segments = filePath.split("/"); if (segments.length == 0) return ""; String lastPathComponent = segments[segments.length - 1]; return lastPathComponent; } 

So mache ich das:

 private static void zipFolder(String inputFolderPath, String outZipPath) { try { FileOutputStream fos = new FileOutputStream(outZipPath); ZipOutputStream zos = new ZipOutputStream(fos); File srcFile = new File(inputFolderPath); File[] files = srcFile.listFiles(); Log.d("", "Zip directory: " + srcFile.getName()); for (int i = 0; i < files.length; i++) { Log.d("", "Adding file: " + files[i].getName()); byte[] buffer = new byte[1024]; FileInputStream fis = new FileInputStream(files[i]); zos.putNextEntry(new ZipEntry(files[i].getName())); int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); } zos.close(); } catch (IOException ioe) { Log.e("", ioe.getMessage()); } } 

Wenn du ein java.util.zip-Objekt verwende, kannst du ein Skript schreiben, das die Verzeichnisstruktur nicht verändert.

 public static boolean zip(File sourceFile, File zipFile) { List<File> fileList = getSubFiles(sourceFile, true); ZipOutputStream zipOutputStream = null; try { zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile)); int bufferSize = 1024; byte[] buf = new byte[bufferSize]; ZipEntry zipEntry; for(int i = 0; i < fileList.size(); i++) { File file = fileList.get(i); zipEntry = new ZipEntry(sourceFile.toURI().relativize(file.toURI()).getPath()); zipOutputStream.putNextEntry(zipEntry); if (!file.isDirectory()) { InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); int readLength; while ((readLength = inputStream.read(buf, 0, bufferSize)) != -1) { zipOutputStream.write(buf, 0, readLength); } } } } catch (Exception e) { e.printStackTrace(); return false; } finally { IoUtils.closeOS(zipOutputStream); } return true; } public static List<File> getSubFiles(File baseDir, boolean isContainFolder) { List<File> fileList = new ArrayList<>(); File[] tmpList = baseDir.listFiles(); for (File file : tmpList) { if (file.isFile()) { fileList.add(file); } if (file.isDirectory()) { if (isContainFolder) { fileList.add(file); //key code } fileList.addAll(getSubFiles(file)); } } return fileList; } 
  • Laden Sie den Sound aus dem Speicher in Android
  • Android 3.x + Java ZipFile Klasse - Kann nicht lesen ZipEntries aus großen Dateien
  • Memory-mapped Zip-Datei in Java
  • Zipping Dateien und Ordner in Android
  • Kann TTF-Datei nicht direkt aus einem ZIP mit libzip und FreeType laden
  • Wie kann ich die Android-Support-Bibliothek in Eclipse anhängen?
  • Ändern von Inhalten von Android .aar-Datei / Konvertieren in und aus .zip-Format
  • Lesen von Dateien aus einer ZIP-Datei in Ihrem Android-Assets-Ordner
  • So entpacken Sie Datei aus InputStream
  • Wie zip Datei mit Passwort (AES) für iOS und Android?
  • Osmdroid Offline-Datei
  • Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.