title: Uzip folders recursively -android
body: <p>I have tried to unzip a zipped file (This file contains many sub-folders and files).</p>
  
  <pre><code>I am not able to create sub-folders while unzipping the file.
  </code></pre>
  
  <p>Each time I am getting an error saying:</p>
  
  <pre><code>No such file or directory.
  </code></pre>
  
  <p>I have searched a lot about this like: </p>
  
  <ol>
  <li><a href="https://stackoverflow.com/questions/5028421/android-unzip-a-folder">Android - Unzip a folder?</a></li>
  <li><a href="http://www.roseindia.net/tutorial/java/corejava/zip/ZipIsDirectory.html" rel="nofollow noreferrer">http://www.roseindia.net/tutorial/java/corejava/zip/ZipIsDirectory.html</a></li>
  <li><a href="https://stackoverflow.com/questions/7697466/unzip-a-zipped-file-on-sd-card-in-android-application">Unzip a zipped file on sd card in Android application</a></li>
  <li><a href="https://stackoverflow.com/questions/981578/how-to-unzip-files-recursively-in-java">How to unzip files recursively in Java?</a></li>
  </ol>
  
  <p>But, nothing helped me.</p>
  
  <p>Following is what I have tried:</p>
  
  <pre><code>public class UnZipper {
  
      private static final String TAG = "UnZip";
      private String mFileName, mDestinationPath;
  
      public UnZipper(String fileName, String destinationPath) {
          mFileName = fileName;
          mDestinationPath = destinationPath;
      }
  
      public String getFileName() {
          return mFileName;
      }
  
      public String getDestinationPath() {
          return mDestinationPath;
      }
  
      // shrikant
      public void unzip() {
          String fullPath = mFileName;
          Log.d(TAG, "unzipping " + mFileName + " to " + mDestinationPath);
          doInBackground(fullPath, mDestinationPath);
      }
  
      // shrikant: I have changed return type from Boolean to boolean.
      protected boolean doInBackground(String filePath, String destinationPath) {
  
          File archive = new File(filePath);
          boolean returnValue = false;
          try {
              ZipFile zipfile = new ZipFile(archive);
  
              for (Enumeration e = zipfile.entries(); e.hasMoreElements();) {
  
                  ZipEntry entry = (ZipEntry) e.nextElement();
                  try {
                      unzipEntry(zipfile, entry, destinationPath);
                      Log.d("Unzipped", entry.getName());
                      returnValue = true;
                  } catch (Exception ex) {
                      Log.e(TAG,
                              "Error while extracting file: " + entry
                                      + ex.getMessage());
                  }
              }
          } catch (Exception e) {
              Log.e(TAG, "Error while extracting file " + archive, e);
              // return false;
          }
          return returnValue;
      }
  
      // shrikant: I have changed return type from void to boolean.
      /**
       * Unzips the zipped file into outputDir path.
       * 
       * @param zipfile
       * @param entry
       * @param outputDir
       * @throws IOException
       */
      private void unzipEntry(ZipFile zipfile, ZipEntry entry, String outputDir)
              throws IOException {
          Log.d("CURRENT ZIP", entry.getName());
          String _dir = null, fileName = null;
          if (entry.getName().contains("\\")) {
  
              _dir = entry.getName().substring(0, entry.getName().indexOf('\\'));
              createDir(new File(outputDir, _dir));
              fileName = entry.getName().substring(entry.getName().indexOf('\\'));
          }
  
          // Change by Prashant : To Remove "/" from file Name Date : 5/01/2011
          if (fileName.toString().startsWith("\\")) {
              fileName = fileName.substring(1); // End
          }
  
          if (_dir != "")
              outputDir = outputDir + "/" + _dir;
  
          File outputFile = new File(outputDir, fileName);
          if (!outputFile.getParentFile().exists()) {
              createDir(outputFile.getParentFile());
          }
          Log.d("OUTPUT FILE", outputDir + fileName);
          Log.v(TAG, "Extracting: " + entry);
  
          Log.d("FOUND inside unzipEntry()", entry.getName());
  
          BufferedInputStream inputStream = new BufferedInputStream(
                  zipfile.getInputStream(entry));
  
  // **here I am getting error.**
  
          BufferedOutputStream outputStream = new BufferedOutputStream(
                  new FileOutputStream(outputFile));
  
  // **above line.**
  
          try {
              copy(inputStream, outputStream);
          } finally {
              outputStream.close();
              inputStream.close();
          }
  
      }
  
      private void createDir(File dir) {
          if (dir.exists()) {
              return;
          }
          Log.v(TAG, "Creating dir " + dir.getName());
          if (!dir.mkdirs()) {
              throw new RuntimeException("Cannot create dir " + dir);
          }
      }
  
      private void copy(BufferedInputStream input, BufferedOutputStream output)
              throws IOException {
          byte[] buffer = new byte[4096];
          int size;
          while ((size = input.read(buffer)) != -1)
              output.write(buffer, 0, size);
      }
  
  }
  </code></pre>
  
  <p><strong>My question is</strong>: (Please look at the code)</p>
  
  <p>When I am calling <code>unzipEntry()</code>, when it encounters a sub-folder, it passes something like "<code>/data/abc.ext</code>", but my file system does not contain any folder named as "<strong>data</strong>", I even tried to create it, but failed in doing so. </p>
  
  <blockquote>
    <p>So how to create sub-folders from zipped file to destination path??</p>
  </blockquote>
  
  <p>I have even tried method:</p>
  
  <pre><code>if(entry.isDirectory) {
  // create directory
  }
  </code></pre>
  
  <p>But this doesn't get called, since <code>unzipEntry()</code> (Please look in <code>for() loop</code>) directly passes the file under sub-folder.</p>
  
  <p>Please help me on this.</p>
  
  <p>Thank you.</p>