2016-01-27 2 views
0

Я хочу закрепить более одного каталога. Это означает, что у меня есть 1 внутренний каталог и 1 родительский каталог. Теперь я хочу застегнуть родительский каталог.Как zip-файлы включают в себя подпапки в android

Я использую следующие коды:

Мой путь к файлу:

/data/data/com/app/1430159400000/32640/Images/capture_Image_20150427_115541.png" 
/data/data/com/app/1430159400000/32640/Images/capture_Image_20150427_115542.png" 
/data/data/com/app/1430159400000/32640/Images/ChildImages/capture_Image_20150427_115543.png" 
/data/data/com/app/1430159400000/32640/Images/ChildImages/capture_Image_20150427_115544.png" 
/data/data/com/app/1430159400000/32640/Images/capture_Image_20150427_115545.png" 
/data/data/com/app/1430159400000/32640/Images/capture_Image_20150427_115546.png" 

Чтобы получить файлы из каталога: -

public void getListFilesForCreatingZip(File parentDir) { 
     String[] filesPath = null; 
     File[] files = parentDir.listFiles(); 
     filesPath = new String[(int) parentDir.length()]; 
     int index = 0; 
     int index1=0; 
     for (File file : files) { 
      if (file.isDirectory()) { 
       if(file.getName().equals("ChildImages")) 
       { 
        File[] files1 = file.listFiles(); 
        for(File ss:files1) 
        { 
         filesPath[index]=ss.getPath(); 
         index++; 
        } 
       } 
      } else { 
       filesPath[index] = file.getPath(); 
      } 
      index++; 
     } 
     zip(filesPath, "PathName"; 
    } 

Для Zip файлы: -

public void zip(String[] _files, String zipFileName) { 
     try { 
      BufferedInputStream origin = null; 
      /*File root = Application.getInstance().getDir("bol", Context.MODE_PRIVATE); 
      File customDir = new File(root + File.separator + File.separator + PreferenceManagerForBol.getInstance().getBolSelectedDate() + File.separator + PreferenceManagerForBol.getInstance().getBolOrderNumber()); 
      if (customDir.exists() == false) { 
       customDir.mkdirs(); 
      } */ 
      File file = new File(BolDetailsHandler.getInstance().createBasePath(), zipFileName + ".zip"); 
      FileOutputStream dest = new FileOutputStream(file); 
      ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
        dest)); 
      byte data[] = new byte[BUFFER]; 

      for (int i = 0; i < _files.length; i++) { 
       if(!_files[i].contains(".zip")) 
       { 
       Logger.v("Compress", "Adding: " + _files[i]); 
       FileInputStream fi = new FileInputStream(_files[i]); 
       origin = new BufferedInputStream(fi, BUFFER); 

       ZipEntry entry = new ZipEntry(_files[i].substring(_files[i].lastIndexOf("/") + 1)); 
       out.putNextEntry(entry); 
       int count; 

       while ((count = origin.read(data, 0, BUFFER)) != -1) { 
        out.write(data, 0, count); 
       } 
       origin.close(); 
       } 
      } 

      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

Когда я использую следующее Коды Я столкнулся с исключением нулевого указателя в методе zip(). Когда метод zip() пытается прочитать дочерний путь и снова попытается прочитать родительский путь, он показывает исключение с помощью исключающего указателя.

Пожалуйста, дайте мне любую идею, чтобы решить эту проблему.

+0

Не пытайтесь вызвать методы нулевых объектов – 1615903

ответ

1

index++;. У вас их двое. Поместите второй, как первый, сразу после filesPath[index] = file.getPath();.

Но ваши массивы массивов строкPath = new String [(int) parentDir.length()]; таким образом, не будет подходящего размера. Нет места для файлов подкаталога.

Вы можете гораздо лучше использовать <String> ArrayList, так как вы можете добавить столько, сколько хотите, не задумываясь о том, сколько будет.

+0

Спасибо за ответ. Я использовал другое решение для этой проблемы. Спасибо за предложение ArrayList. Это помогает мне в еще одном вопросе. –

Смежные вопросы