2011-07-13 22 views
12

ユーザーが電子メールでプロジェクトを共有できるようにするには、「プロジェクト」フォルダを開く必要があります。私は1つのジッパーに複数のファイルを圧縮するためのクラスを見つけましたが、私は私のジッパーにフォルダ構造を保持する必要があります。アンドロイドでこれを達成する方法はありますか?前もって感謝します。androidのファイルがいっぱいのフォルダを圧縮/圧縮

+0

明確にするために、Android開発プロジェクトまたはアプリで開発されたプロジェクトを意味しますか? –

+0

アプリで開発されたプロジェクトです、残念です。また、私はこれが私が必要としていると思う:http://stackoverflow.com/questions/1399126/java-util-zip-recreating-directory-structureしかし、私はそれをコピーしたが、私はベストを尽くしたが、デキューキュー=新しいLinkedList ();働く私はDequeがインターフェースでLinkedListが実装していることを知っていますが、eclipesはエラーを返すだけです。 – Mark

+1

Nevermindは、多くの検索の後でそれを行う方法を見つけました:http://www.crazysquirrel.com/computing/java/basics/java-directory-zipping.jspx – Mark

答えて

1

java.util.zipオブジェクトを使用する場合は、ディレクトリ構造を変更しないスクリプトを記述できます。

34

このコードはこのトリックを行う必要があります。

注:マニフェストファイルにWRITE_EXTERNAL_STORAGE権限を追加することで、アプリケーションにファイル書き込み権限を追加する必要があります。

/* 
* 
* 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; 
} 
+0

Hey @HailZeon!素晴らしいコード、そして本当に役に立つ。 getLastPathComponent(sourcePath)は何を行い、どのように定義されていますか?ありがとう! –

+0

こんにちは@RaymondMachira。私はgetLastPathComponentの定義を追加しました。基本的にはパス( "folder1/subfolder/example.txt")をとり、 "folder1/subfolder /"を返します。 zipファイルにはその中に定義されているフォルダが含まれていない可能性がありますので、サブパスを削除して追加する必要があります。 – HailZeon

+0

static final int BUFFER = 2048; – user1546570

12

これは、私はそれを行う方法です。

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()); 
    } 
} 
+1

完璧な答え!シンプルで素晴らしい作品 – Khay

+0

ソースフォルダに別のフォルダが含まれていると正しく動作しない – tibbi

0
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; 
} 
0

がこのlocationからzip4jライブラリを使用してください。 jarファイルを"app/libs/"フォルダにインポートします。ディレクトリ/ファイルを圧縮するには、次のコードを使用してください。

try { 
    File input = new File("path/to/your/input/fileOrFolder"); 
    String destinationPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "zippedItem.zip"; 
    ZipParameters parameters = new ZipParameters(); 
    parameters.setCompressionMethod(Zip4jConstants.COMP_STORE); 
    parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); 
    File output = new File(destinationPath); 
    ZipFile zipFile = new ZipFile(output); 
    // .addFolder or .addFile depending on your input 
    if (sourceFile.isDirectory()) 
     zipFile.addFolder(input, parameters); 
    else 
     zipFile.addFile(input, parameters); 
    // Your input file/directory has been zipped at this point and you 
    // can access it as a normal file using the following line of code 
    File zippedFile = zipFile.getFile(); 
} catch (ZipException e) { 
    Log.e(TAG, Log.getStackTraceString(e)); 
} 
関連する問題