2011-01-29 10 views
1

iPhoneアプリの.ipaファイルを解凍します。 これは実際には正常に抽出するzipファイルです。 しかし、実際のアプリケーションファイルは、.appが終わるフォルダです(すべてのMacアプリケーションは実際には.appという末尾のフォルダです)。 今度は、ピリオドがjava.util.zipの問題であるようです。java.util.zipにファイル名/ディレクトリ名のピリオドに問題がありますか?

public static void main(String[] args) throws IOException { 
    ZipFile zipFile = new ZipFile("file.zip"); 
    String path = ""; 

    Enumeration files = zipFile.entries(); 

    while (files.hasMoreElements()) { 
     ZipEntry entry = (ZipEntry) files.nextElement(); 
     if (entry.isDirectory()) { 
      File file = new File(path + entry.getName()); 
      file.mkdir(); 
      System.out.println("Create dir " + entry.getName()); 
     } else { 
      File f = new File(entry.getName()); 
      FileOutputStream fos = new FileOutputStream(f); //EXception occurs here 
      InputStream is = zipFile.getInputStream(entry); 
      byte[] buffer = new byte[1024]; 
      int bytesRead = 0; 
      while ((bytesRead = is.read(buffer)) != -1) { 
       fos.write(buffer, 0, bytesRead); 
      } 
      fos.close(); 
      System.out.println("Create File " + entry.getName()); 
     } 
    } 
} 

これが私の出力です:

Exception in thread "main" java.io.FileNotFoundException: Payload/SMA Jobs.app/06-magnifying-glass.png (No such file or directory) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131) 
    at Main.main(Main.java:27) 
    enter code here 

誰もがそれらの期間を処理する方法を知っていますか?

答えて

2

まず、mkdir()ではなくmkdirs()を使用する必要があります。

第2に、zipファイルには必ずしもすべてのディレクトリエントリが含まれているわけではありません(または正しい順序になっているとは限りません)。ベストプラクティスは、コードの両方のブランチにディレクトリを作り、これを追加することです:

} else { 
     File f = new File(entry.getName()); 
     f.getParent().mkdirs(); 

(あなたが確認のgetParent(作るためにいくつかのチェックを追加する必要があります)など、nullではありません)。

+0

平均getParentFile()と思いますか? – tzippy

+0

それは私の問題を完全に解決しました! Dankeschön! – tzippy

0

期間は問題ではないと思います。出力しようとしているファイルの絶対パスを見て、正しい場所を指していることを確認してください。

0
if (entry.isDirectory()) { 
      File file = new File(path + entry.getName()); 
.... 
} else { 
      File f = new File(entry.getName()); 
.... 

ディレクトリを作成するときは、渡されたファイルのパスは、パス+ entry.getName() であるが、ファイルの作成時に、渡されたファイルのパスは、パス+エントリへのファイルパスを変更した後entry.getName()

あります。 getName()、コードはピリオドファイル名と通常のファイル名で動作します。 :)

関連する問題