2

現在のファイルの場所:C:\bearCave\bear.mp3

as のzipファイルとして表示されるように圧縮しC:\bearCaveたいbear.zip。では、中間フォルダなしbear.zipで見たいだけです。bear.mp3

つまり、ファイル構造は次のようにする必要があります。

bear.zip
 - bear.mp3

正しい場所に生成されたファイルを圧縮することができましたC:\bearCave。興味深いことに、その zip ファイル内に、bearCave次のような私のファイルを含む別のフォルダーがあります。

   bear.zip
    - C: 
     - bearCave
      - bear.mp3

編集 1: 考えられる手がかり、outfilename=C:\bearCave\bear.zip

これが私のコードです:

    String[] filenames = new String[]{file.getPath()};
    int dirEnd = (file.getPath()).indexOf(file.getName());
    String fileDirectory=file.getPath().substring(0, dirEnd);
    Logger.debug("dirEnd="+dirEnd);
    Logger.debug("fileDir="+fileDirectory);
    String outFilename = fileDirectory + (file.getName()).substring(0, ((file.getName()).length())-4) + ".zip";
    Logger.debug("outFile=" + outFilename);
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));

    for (int i=0; i<filenames.length; i++) {
        FileInputStream in = new FileInputStream(filenames[i]);

        // Add ZIP entry to output stream.
        out.putNextEntry(new ZipEntry(filenames[i]));

        // Transfer bytes from the file to the ZIP file
        int len;
        while ((len = in.read(buf)) > 0) {
            Logger.debug("len = " + len);
            out.write(buf, 0, len);
        }

        // Complete the entry
        out.closeEntry();
        in.close();
        Logger.debug("entry clsoed");
    }

    // Complete the ZIP file
    out.close();
    Logger.debug("zipping complete!");
} catch (IOException e) {
    Logger.error(e);
    Logger.debug(e);
}

スタックトレース

fileName = bear.mp3
filePath = C:\bearCave\bear.mp3
fileDir=C:\bearCave\
outFile=C:\bearCave\bear.zip
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 1024
len = 508
entry clsoed
zipping Complete!
4

1 に答える 1

1

あなたのfilenames[]配列には何が入っていますか?問題はこの行だと思います:

// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filenames[i]));

私が見ているようにfilenames[i]、ファイルへのパス全体でありZipEntry、指定されたパスを「独自の」ディレクトリ構造に解析するため、この奇妙な構造が作成されます。ZipEntry指定されたファイル名のみで (パス コンポーネントなしで) を作成してみてください。

于 2013-03-22T19:48:37.960 に答える