FileNotFound при распаковке файла с подпапками

У меня есть класс UnZip для получения изображений из базы данных

class UnZip extends AsyncTask<String, Integer, String> {
    private  String _mArchivePath;
    private  String _mOutPutStream;
    private int per;

    public UnZip(String mArchivePath,String mOutPutStream) {
        _mArchivePath = mArchivePath;
        _mOutPutStream = mOutPutStream;

    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        InputStream inputstream; 
        ZipInputStream zipinputstream; 
        try { 
         String filename; 
         inputstream = new FileInputStream(_mArchivePath); 
         zipinputstream = new ZipInputStream(new BufferedInputStream(inputstream)); 
         ZipEntry mZipEntry; 
         byte[] buffer = new byte[32*1024]; 
         int count; 

         while ((mZipEntry = zipinputstream.getNextEntry()) != null) { 
          Log.v("Decompress", "Unzipping " + mZipEntry.getName());
          filename = mZipEntry.getName();
          per++;
          publishProgress(per);

          if (mZipEntry.isDirectory()) { 
           File fmd = new File(_mOutPutStream + filename); 
           fmd.mkdirs(); 
           continue; 
          } 

          FileOutputStream fileoutputstream = new FileOutputStream(_mOutPutStream + filename); 

          while ((count = zipinputstream.read(buffer)) != -1) { 
           fileoutputstream.write(buffer, 0, count); 
          } 


          fileoutputstream.close(); 
          zipinputstream.closeEntry(); 
         } 

         zipinputstream.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 

        } 
        return null;

Он отлично работает с файлом database.zip, содержащим изображения (32 МБ~), но когда я попробовал его с тем же файлом database.zip, но с некоторыми дополнительными изображениями (43 МБ ~), он выдает эту ошибку:

03-03 23:42:00.200: V/Decompress(11593): Unzipping /database/weed/ak_47_1.jpg
03-03 23:42:00.202: W/System.err(11593): java.io.FileNotFoundException: /storage/emulated/0/unzipped/database/weed/ak_47_1.jpg: open failed: ENOENT (No such file or directory)
03-03 23:42:00.204: W/InputMethodManagerService(584): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@cce61f3 attribute=android.view.inputmethod.EditorInfo@aa9eeb0, token = android.os.BinderProxy@2db5667

Я нашел проблему, она возникает, когда я пытаюсь разархивировать файл с подпапками, если подпапки не существуют, приложение выдает мне эту ошибку. На мгновение я изменил основной код, поэтому при запуске приложение автоматически создает папки, потому что я знаю структуру zip, но если я хочу использовать другой zip, что я могу сделать?


person Leonardo    schedule 03.03.2015    source источник
comment
Проверьте, достаточно ли места для хранения, а затем проверьте, действителен ли архив, используя другой инструмент для извлечения содержимого. Затем взгляните на файл, который нельзя распаковать, просто добавьте этот файл в новый zip и попробуйте. Попробуйте отследить проблему до этого файла, а затем пройдитесь по коду, чтобы отладить проблему.   -  person BrentM    schedule 04.03.2015
comment
Я нашел проблему, она возникает, когда я пытаюсь разархивировать файл с подпапками, если подпапки не существуют, приложение выдает мне эту ошибку. На мгновение я изменил основной код, поэтому при запуске приложение автоматически создает папки, потому что я знаю структуру zip, но если я хочу использовать другой zip, что я могу сделать?   -  person Leonardo    schedule 05.03.2015
comment
mkdirs() может не работать для вас. Пройдитесь по коду, чтобы понять, почему. Попробуйте изменить конструктор файла с new File(_mOutPutStream + filename) на new File(_mOutPutStream, filename). Поскольку существующий код будет работать только в том случае, если у вас есть косая черта в конце имени папки.   -  person BrentM    schedule 05.03.2015
comment
Я пытался использовать запятую, но это все равно не работает   -  person Leonardo    schedule 05.03.2015


Ответы (1)


Похоже, что-то не так с кодом, который вы используете для распаковки ZIP, т.е. создание подпапок не работает должным образом.

Лучше всего исследовать это, как предложил @BrentM, однако, если вы спешите, может помочь быстрый поиск по SO:

Как программно разархивировать файлы в Android?

Я использовал следующий метод из этой темы и могу подтвердить, что он отлично работает:

private boolean unpackZip(String path, String zipname)
{       
     InputStream is;
     ZipInputStream zis;
     try 
     {
         String filename;
         is = new FileInputStream(path + zipname);
         zis = new ZipInputStream(new BufferedInputStream(is));          
         ZipEntry ze;
         byte[] buffer = new byte[1024];
         int count;

         while ((ze = zis.getNextEntry()) != null) 
         {
             filename = ze.getName();

             // Need to create directories if not exists, or
             // it will generate an Exception...
             if (ze.isDirectory()) {
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
             }

             FileOutputStream fout = new FileOutputStream(path + filename);

             while ((count = zis.read(buffer)) != -1) 
             {
                 fout.write(buffer, 0, count);             
             }

             fout.close();               
             zis.closeEntry();
         }

         zis.close();
     } 
     catch(IOException e)
     {
         e.printStackTrace();
         return false;
     }

    return true;
}
person JakeP    schedule 04.03.2015
comment
Я пробовал также этот код, но все равно выдавал ошибку. Возможно, я неправильно набираю путь и файл. Я использую path= Evinronment.getExternalStorageDirectory().getPath() + /; файл = база данных.zip - person Leonardo; 05.03.2015
comment
Вы уверены, что файл там? Вы всегда можете поискать его в файловом менеджере, чтобы установить его реальное местоположение. - person JakeP; 05.03.2015
comment
Что ж, вы можете рекурсивно просмотреть все каталоги, начиная с getExternalStorageDirectory(), и распечатать все файлы там, чтобы увидеть, где именно находится ваш файл. - person JakeP; 05.03.2015