2012-03-13 80 views
10

我得到了下面的.NET代碼,它看起來一切都是正確的,但我發現找不到文件例外...解壓壓縮文件...文件未發現異常

我有一個名爲NewForestPonies文件。 EPUB在SD卡

權限:

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

CODE:

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

檢查您的文件在這條道路/mnt/sdcard/EPUB/META-INF/container.xml – 2012-03-13 05:14:18

+0

@Samir我只有zip文件..我需要手動創建目標文件夾和文件嗎?它的代碼完成了嗎? – vnshetty 2012-03-13 05:16:03

+0

你有權在SD卡上寫字嗎? – Jerome 2012-03-13 05:29:07

回答

4

我想在你的代碼的問題是,你正在關閉ZipInputStreamZIN在第一個while循環。

使用下面的代碼run(),它可能會幫助你。

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

我猜要解壓縮位於ZIP文件到/ mnt/SD卡/ EPUB /,但在你的代碼,您試圖訪問container.xml中這可能是居民在ZIP文件的META-INF /目錄中(我沒有這個文件,所以這裏主要是猜測)。

所以,你應該做的是通過ZIP文件(例如,/mnt/sdcard/EPUB/book1.epub)的位置,就像這樣:

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

之後就可以打開未壓縮的容器。 xml與你自己的代碼在/mnt/sdcard/EPUB/META-INF/container.xml

+0

你的假設是正確的,我會嘗試你的代碼... – vnshetty 2012-03-13 05:48:47

+0

不working..do我需要手動創建目標文件夾和文件?它通過代碼完成了嗎? – vnshetty 2012-03-13 06:00:47

+0

@vnshetty好了,下載一個隨機EPUB文件和運行代碼後,我發現這個問題是這樣的: \t \t'f輸出=新的FileOutputStream中(_location + ze.getName());' \t \t那裏沒有分隔符插入到兩個String之間,所以儘管創建了正確的目錄,FileOutputStream被指示寫入一個不存在的目錄中的文件。嘗試下面的代碼,它應該工作: 'file = new File(_location,ze.getName());' 'file.getParentFile()。mkdirs();' 'fout = new FileOutputStream(file);' 順便說一下,使用新的File(String,String)構建文件路徑總是比較安全。 – Kai 2012-03-13 07:40:02

2

你可以嘗試創建新的文件嗎?

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

檢查返回值:

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

如果它返回false不會被創建的目錄。這可能可以解釋爲什麼你在例外情況下得到「(不是目錄)」。

mkdirs()文檔說:

注意,此方法不會失敗拋出IOException。呼叫者 必須檢查返回值。

嘗試創建這樣的目錄:

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

這避免了與 '/' 分隔符搞亂。

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

異常顯示它不是一個目錄,所以在你的代碼 -

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();   
     }