Является ли код, который я использую, чтобы сделать файлы .zip правильными? - PullRequest
1 голос
/ 28 сентября 2011

Я использую этот код в 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 ()" всегда пусто:

    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 голосов
/ 29 сентября 2011

Исходя из рассуждений, которые у нас были на этот вопрос , размер вашей записи установлен на 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);

Извинения, если синтаксис неправильный, это не проверено.

0 голосов
/ 28 сентября 2011

Ваша проблема может быть связана с режимом объекта FileInputStream. Эта ссылка (имеет код C #) утверждает, что поток должен быть читаемым. Попробуйте изменить свой код в соответствии с их рекомендациями. Размещаем часть кода со своего сайта:

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