2011-05-17 52 views
2

我想解壓Android設備的SDCARD上的文件。 如果ZIP文件只包含文件NOT FOLDERS一切都很好。但是,我希望應用程序解壓縮的生產文件包含多個目錄和子目錄。這是我遇到問題的地方。Android UNZIP Inputstream問題

該代碼不會創建所需的文件夾結構。如果我在運行該類之前手動創建文件夾,它將按計劃解壓縮,但將來我不知道目錄結構並需要代碼來創建適當的文件夾結構。 這是我與

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.widget.TextView; 

public class HomeActivity extends Activity 
{ 
    private TextView tv; 

    private static final String ROOT_FOLDER = Environment.getExternalStorageDirectory() 
      + File.separator + "FacebookPhotos"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     tv = (TextView) findViewById(R.id.tv); 
     tv.append("Reading zip file from assets folder..."); 

     // Start the unzipping process 
     thread.start(); 
    } 

    private Thread thread = new Thread() 
    { 

     @Override 

     public void run() 
     { 
      sendMessage("-----------------------------------------------"); 

      // Create a directory in the SDCard to store the files 
      File file = new File(ROOT_FOLDER); 
      if (!file.exists()) 
      { 
       file.mkdirs(); 
      } 
      else 
      { 
       file.delete(); 
      } 
      try 
      { 
       // Open the ZipInputStream 


       ZipInputStream inputStream = new ZipInputStream(new FileInputStream("/sdcard/Photos/photos.zip")); 


       // Loop through all the files and folders 
       for (ZipEntry entry = inputStream.getNextEntry(); entry != null; entry = inputStream 
         .getNextEntry()) 
       { 
        sendMessage("Extracting: " + entry.getName() + "..."); 

        String innerFileName = ROOT_FOLDER + File.separator + entry.getName(); 

        File innerFile = new File(innerFileName); 
        if (innerFile.exists()) 
        { 
         innerFile.delete(); 
        } 

        // Check if it is a folder 
        if (entry.isDirectory()) 


        { 
        // Its a folder, create that folder 
         innerFile.mkdirs(); 

        } 
        else 
        { 
         // Create a file output stream 
         FileOutputStream outputStream = new FileOutputStream(innerFileName); 
         final int BUFFER = 2048; 

         // Buffer the output to the file 
         BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream, 
           BUFFER); 

         // Write the contents 
         int count = 0; 
         byte[] data = new byte[BUFFER]; 
         while ((count = inputStream.read(data, 0, BUFFER)) != -1) 
         { 
          bufferedOutputStream.write(data, 0, count); 
         } 

         // Flush and close the buffers 
         bufferedOutputStream.flush(); 
         bufferedOutputStream.close(); 
        } 
        sendMessage("DONE"); 

        // Close the current entry 
        inputStream.closeEntry(); 
       } 
       inputStream.close(); 
       sendMessage("-----------------------------------------------"); 
       sendMessage("Unzipping complete"); 

      } 
      catch (IOException e) 
      { 
       sendMessage("Exception occured: " + e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 

    }; 

    private Handler handler = new Handler() 
    { 

     @Override 
     public void handleMessage(Message msg) 
     { 
      tv.append("\n" + msg.getData().getString("data")); 
      super.handleMessage(msg); 
     } 

    }; 

    private void sendMessage(String text) 
    { 
     Message message = new Message(); 
     Bundle data = new Bundle(); 
     data.putString("data", text); 
     message.setData(data); 
     handler.sendMessage(message); 
    } 
} 

回答

3

退房這個答案

Android - Unzip a folder?

我覺得有時候在ZIP文件使用的代碼,目錄條目可他們的文件後添加。在這種情況下,您不會在文件之前獲取目錄。鏈接的示例調用file.getParentFile()。exists()用於常規文件,並在不存在eixst時創建該目錄。