我正在使用的代码使.zip文件正确吗?

时间:2011-09-28 17:32:59

标签: c# java android extraction

我在C#中使用此代码来压缩文件..我需要在Android应用程序(java)中打开这些文件:

String mp3Files = "E:\\"; 
int TrimLength = mp3Files.ToString().Length;

byte[] obuffer;
string outPath = mp3Files + "\\" + i + ".zip";
ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath)); // create zip stream
oZipStream.SetLevel(9); // maximum compression

foreach (string Fil in ar) // for each file, generate a zipentry
{

    oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
    oZipStream.PutNextEntry(oZipEntry);

    if (!Fil.EndsWith(@"/")) // if a file ends with '/' its a directory
    {
        ostream = File.OpenRead(Fil);
        obuffer = new byte[ostream.Length];
        ostream.Read(obuffer, 0, obuffer.Length);
        oZipStream.Write(obuffer, 0, obuffer.Length);
    }
}
oZipStream.Finish();
oZipStream.Close();

我在java中提取这些文件时遇到问题,我想确保问题不是来自zip文件..所以这段代码是否正确? java可以读取这些拉链吗?

我只是尝试使用winrar正常创建,文件提取代码给出了同样的问题..问题是“zin.getNextEntry()”始终为null:

    String zipFile = Path + FileName;


            FileInputStream fin = new FileInputStream(zipFile);
            ZipInputStream zin = new ZipInputStream(fin);

            ZipEntry ze = null;
            while ((ze = zin.getNextEntry()) != null) {
                UnzipCounter++;
                if (ze.isDirectory()) {
                    dirChecker(ze.getName());
                } else {
                    FileOutputStream fout = new FileOutputStream(Path
                            + ze.getName());
                    while ((Unziplength = zin.read(Unzipbuffer)) > 0) {
                        fout.write(Unzipbuffer, 0, Unziplength);                    
                    }
                    zin.closeEntry();
                    fout.close();

                }

            }
            zin.close();

2 个答案:

答案 0 :(得分:0)

您的问题可能是由FileInputStream对象的模式引起的。 This link (has C# code)表示流必须是可读的。尝试根据他们的建议更改您的代码。从他们的网站发布部分代码:

using (var raw = File.Open(inputFileName, FileMode.Open, FileAccess.Read))
{
    using (var input= new ZipInputStream(raw))
    {
        ZipEntry e;
        while (( e = input.GetNextEntry()) != null)
        {

答案 1 :(得分:0)

根据我们在this question上的讨论,您的条目大小设置为4294967295,这就是您在java中解压缩时出现问题的原因。尝试设置尺寸:

FileInfo fi = new FileInfo(Fil); // added this line here
oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
oZipEntry.Size = fi.Length;              // added this line here
oZipStream.PutNextEntry(oZipEntry);

如果语法不正确,请道歉,这是未经测试的。