2012-03-13 19 views
10

Me siguiente código de red y parece que todo está correcto, pero yo estoy haciendo excepción del archivo no encontrado ...descomprimir un archivo zip ... Archivo no encontrado excepción

que tienen un archivo llamado NewForestPonies. epub en sdcard

permiso:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

CÓDIGO:

String ZipFileLocation=Environment.getExternalStorageDirectory()+"/NewForestPonies.epub"; 
    String unZipFileLocation=Environment.getExternalStorageDirectory()+"/DEST/"; 
    Decompress decomp=new Decompress(ZipFileLocation, unZipFileLocation, "zip"); 
    decomp.run(); 



public Decompress(String zipFile, String location,String t) { 
    super(t); 
    _zipFile = zipFile; 
    _location = location; 
} 
public void run() { 
    FileInputStream fin=null; 
    ZipInputStream zin=null; 
    File file =null; 
    ZipEntry ze ; 
    FileOutputStream fout=null; 
    try{ 
     System.out.println(_zipFile); 
     System.out.println(_location); 
     fin = new FileInputStream(_zipFile); 
     zin = new ZipInputStream(fin); 
     ze= null; 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((ze = zin.getNextEntry()) != null) { 
      file = new File((_location +"/" + ze.getName())); 
      file.getParentFile().mkdirs(); 
      fout= new FileOutputStream(_location + ze.getName()); 
      while ((length = zin.read(buffer))>0) { 
       fout.write(buffer, 0, length); 
      } 
      zin.closeEntry(); 
      fout.close();   
     } 
     //MyDownloadListener.progress=70; 
     zin.close(); 
    }catch(Exception e) { 
     Log.e("Decompress", "unzip", e); 
    } 
    finally { 

      try { 
       fin.close(); 
       zin.close(); 
       fout.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 




    } 

} 

errror:

03-20 15:49:15.909: ERROR/Decompress(9479): java.io.FileNotFoundException: /mnt/sdcard/DEST/NewForestPonies/iTunesMetadata.plist (Not a directory) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:239) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at java.io.FileOutputStream.<init>(FileOutputStream.java:101) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at java.io.FileOutputStream.<init>(FileOutputStream.java:77) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at com.AndroidExplorer.Decompress.run(Decompress.java:42) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at com.AndroidExplorer.DecompressActivity.onCreate(DecompressActivity.java:23) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.ActivityThread.access$1500(ActivityThread.java:122) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.os.Looper.loop(Looper.java:132) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at android.app.ActivityThread.main(ActivityThread.java:4028) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at java.lang.reflect.Method.invoke(Method.java:491) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
03-20 15:49:15.909: ERROR/Decompress(9479):  at dalvik.system.NativeStart.main(Native Method) 
+0

comprobar que tiene archivo de la ruta /mnt/sdcard/EPUB/META-INF/container.xml –

+0

@Samir i tener solo archivo zip. ¿Necesito crear carpetas y archivos de destino manualmente? Está hecho en código ¿verdad? – vnshetty

+0

¿Tiene derecho a escribir en la tarjeta sd? – Jerome

Respuesta

4

Creo que el problema es en el código que está cerrando ZipInputStreamzin en primera bucle while.

Utilice el siguiente código para ejecutar(), puede que le ayude.

public void run() { 
    BufferedOutputStream bufferedOutputStream = null; 
    FileInputStream fileInputStream; 

    File dest_file = new File(_location); 
    dest_file.mkdirs(); // creates if destination directory not existed  

    try { 
     fileInputStream = new FileInputStream(_zipFile); 
     ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(fileInputStream)); 
     ZipEntry zipEntry; 

     while ((zipEntry = zipInputStream.getNextEntry()) != null) { 
      String zipEntryName = zipEntry.getName(); 
      File file = new File(_location + zipEntryName); 

      if (file.exists()) { 

      } else if (zipEntry.isDirectory()) { 
       file.mkdirs(); 
      } else { 
       byte buffer[] = new byte[1024]; 
       FileOutputStream fileOutputStream = new FileOutputStream(file); 
       bufferedOutputStream = new BufferedOutputStream(fileOutputStream, 1024); 
       int count; 

       while ((count = zipInputStream.read(buffer, 0, 1024)) != -1) { 
        bufferedOutputStream.write(buffer, 0, count); 
       } 
       bufferedOutputStream.flush(); 
       bufferedOutputStream.close(); 
      } 
     } 
     zipInputStream.close(); 
    } catch (Exception e) { 
     Log.e("Decompress", "unzip", e); 
    } 
} 
0

estoy adivinando que el archivo ZIP que desea descomprimir se encuentra en/mnt/sdcard/EPUB /, pero en su código que está intentando acceder a la container.xml que es probablemente residente en META-INF/directorio del archivo ZIP (no tengo el archivo, por lo que es mayormente adivinar aquí).

Así que lo que debe hacer es pasar la ubicación del archivo ZIP (por ejemplo /mnt/sdcard/EPUB/book1.epub), así:

Decompress("/mnt/sdcard/EPUB/book1.epub", "/mnt/sdcard/EPUB",t) 

Después de que se puede abrir el contenedor sin comprimir. xml con su propio código en /mnt/sdcard/EPUB/META-INF/container.xml

+0

su suposición es correcta y voy a probar su código ... – vnshetty

+0

no funciona ... ¿necesito crear carpetas y archivos de destino manualmente? está hecho a través del código ¿verdad? – vnshetty

+0

@vnshetty Ok, después de descargar un archivo EPUB al azar y se ejecuta el código, he encontrado el problema a ser la siguiente: \t \t 'fout = new FileOutputStream (_location + ze.getName());' \t \t donde no hay separador insertado entre las dos Cadenas, por lo que aunque se crea el directorio correcto, FileOutputStream se dirige a escribir en un archivo en un directorio no existente. Pruebe el siguiente código y debería funcionar: 'file = new File (_location, ze.getName());' 'file.getParentFile(). Mkdirs();' 'fout = new FileOutputStream (archivo);' Por cierto, siempre es más seguro usar el nuevo archivo (String, String) para compilar el archivo. – Kai

2

¿Podría intentar crear primero un archivo nuevo?

file = new File((_location +"/" + ze.getName())); 
file.getParentFile().mkdirs(); 
if (!file.isFile()) 
    file.createNewFile(); 
... 
0

Comprobar el valor de retorno de:

boolean result = file.getParentFile().mkdirs(); 

Si volvió false no se han creado los directorios. Esto podría explicar por qué obtiene "(No es un directorio)" en la excepción.

La documentación de mkdirs() dice:

Tenga en cuenta que este método no lanza IOException en caso de fallo. Las personas que llaman deben verificar el valor de retorno.

intente crear los directorios como estos:

boolean result = (new File(_location, ze.getName())).getParentFile().mkdirs(); 

Esto evita jugar con los caracteres '/' separadoras.

0
while ((ze = zin.getNextEntry()) != null) { 
     if (ze.isDirectory()) { 
      file = new File((_location, ze.getName())); 
      if (!file.exists()) 
      file.mkdirs(); 
      continue; 
     } 
     file = new File((_location +"/" + ze.getName())); 
    // file.getParentFile().mkdirs(); 
     fout= new FileOutputStream(_location + ze.getName()); 
     while ((length = zin.read(buffer))>0) { 
      fout.write(buffer, 0, length); 
     } 
     zin.closeEntry(); 
     fout.close();   
    } 
0

Excepción muestra que no es un directorio, por lo que en su código-

while ((ze = zin.getNextEntry()) != null) { 
      file = new File((_location +"/" + ze.getName())); 
**if(file.isDirectory())** 
      file.getParentFile().mkdirs(); 
      fout= new FileOutputStream(_location + ze.getName()); 
      while ((length = zin.read(buffer))>0) { 
       fout.write(buffer, 0, length); 
      } 
      zin.closeEntry(); 
      fout.close();   
     } 
Cuestiones relacionadas