При распаковке ZipEntry возвращает foldername/filename вместо только fodername/, и это вызывает исключение File Not Found

#php #android #codeigniter #unzip #ziparchive

#php #Android #codeigniter #распакуйте #архивировать

Вопрос:

Я создаю zip из серверной части с использованием PHP. и я хочу разархивировать на стороне Android.

Моя структура папок Zip включает

  • Папка 1
    • файл
    • файл
  • Папка 2
    • файл
    • файл
  • Файл

Для создания zip я использую следующий код

 foreach ($files as $name => $file)
                    {
                        // echo $file.'  --   ';
                        if (!$file->isDir())
                        {
                            $filePath = $file->getRealPath();
                            $relativePath = substr($filePath, strlen($rootPath)   1);
                            //echo dirname($file);
                            $zip->addFile($filePath, $relativePath);

                        }
                    }
  

В Android я использую следующий код для распаковки

         InputStream is;
        ZipInputStream zis;
        try {
            String filename;
            is = new FileInputStream(zipFile);
            zis = new ZipInputStream(new BufferedInputStream(is));
            ZipEntry ze;
            byte[] buffer = new byte[8192];
            int count;
            while ((ze = zis.getNextEntry()) != null) {
                filename = ze.getName();
                // it will show 
                // it will generate an Exception...
                if (ze.isDirectory()) {
                    File fmd = new File(location   filename);
                    fmd.mkdirs();
                    continue;
                }
                FileOutputStream fout = new FileOutputStream(location   filename);
                while ((count = zis.read(buffer)) != -1) {
                    fout.write(buffer, 0, count);
                }
                fout.close();
                zis.closeEntry();
            }
            zis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

  

Но это не дает мне правильного вывода, который мне нужен.

Я ожидаю вывода в

ze.getName() является FolderName/

но я фактический результат

FolderName/filename

таким образом, он не учитывает косую черту в качестве каталога и выдает исключение File Not Found.

Комментарии:

1. if (!$file->isDir()) в сочетании с $file->getRealPath(); приведет к полному пути к файлу, а не к каталогу

2. используйте $file->getPath() вместо этого, чтобы получить путь без имени файла

3. @Talal Это не работает с $file->getPath()

4. ZipArchive не принимает добавление папок только файлов или создание пустой папки. я комментирую только на стороне php, если вы добавите файл, скажем, $zip->addFile($filePath, $relativePath); где $relativePath находится somedir/anotherdir/somefile.txt , somedir/anotherdir/ он будет создан автоматически

5. Ваш комментарий для PHP-стороны работает хорошо, что я уже сделал с помощью $zip->addFile($filePath, $relativePath); , но на стороне Android я получил ZipEntry напрямую, как somedir/somefile.txt в виде файла, поэтому сначала он не создаст каталог, он напрямую найдет файл внутри каталога. Поэтому со стороны PHP может быть возможно, что он всегда будет добавлять файл вместо каталога.