zip doc file - получаю битый архив
От: Alex Dav Россия  
Дата: 01.08.11 14:39
Оценка:
Задача такая — я получаю набор байтов, зипую их, и сохраняю в Base64 string — отправляю на другую машину — там из строки получается массив байтов (все еще зипованых) и сохраняется как zip архив, но при открытии такого архива вылетает предупреждение — "неизвестный метод, нет файлов для извлечения".
Вот тестовый код написал:

FileStream file = new FileStream("test.doc", FileMode.Open);
byte[] bytes = new byte[file.Length];
int numBytesToRead = (int)file.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
    // Read may return anything from 0 to numBytesToRead.
    int n = file.Read(bytes, numBytesRead, numBytesToRead);

    // Break when the end of the file is reached.
    if (n == 0)
        break;

    numBytesRead += n;
    numBytesToRead -= n;
}
file.Close();


string str = "";

using (MemoryStream ms = new MemoryStream())
{
    using (ZipOutputStream gzs = new ZipOutputStream(ms))
    {
        //gzs.UseZip64 = UseZip64.Off;
        ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
        gzs.PutNextEntry(entry);
        //using (StreamWriter sw = new StreamWriter(gzs))
        //{
        //    sw.Write(Encoding.UTF8.GetString(bytes));
        //}
        gzs.Write(bytes, 0, bytes.Length);

    }
    str = Convert.ToBase64String(ms.ToArray());
}

FileStream zipfile = new FileStream("test.zip", FileMode.Create);
byte[] zipbytes = Convert.FromBase64String(str);
zipfile.Write(zipbytes, 0, zipbytes.Length);
zipfile.Close();



Для того что бы в архиве оставалось имя файла использую SharpZipLib библиотеку. что инетересно с простым текстовым файлом — все работает.
Подскажите ошибку.
Спасибо.
zip
Re: zip doc file - получаю битый архив
От: Alex Dav Россия  
Дата: 01.08.11 14:42
Оценка:
вру и с текстом не работает
Re: zip doc file - получаю битый архив
От: Gremlin2 http://www.fb2library.net/
Дата: 01.08.11 14:54
Оценка:
Здравствуйте, Alex Dav, Вы писали:

AD>Задача такая — я получаю набор байтов, зипую их, и сохраняю в Base64 string — отправляю на другую машину — там из строки получается массив байтов (все еще зипованых) и сохраняется как zip архив, но при открытии такого архива вылетает предупреждение — "неизвестный метод, нет файлов для извлечения".

AD>Вот тестовый код написал:

AD>
AD>FileStream file = new FileStream("test.doc", FileMode.Open);
AD>byte[] bytes = new byte[file.Length];
AD>int numBytesToRead = (int)file.Length;
AD>int numBytesRead = 0;
AD>while (numBytesToRead > 0)
AD>{
AD>    // Read may return anything from 0 to numBytesToRead.
AD>    int n = file.Read(bytes, numBytesRead, numBytesToRead);

AD>    // Break when the end of the file is reached.
AD>    if (n == 0)
AD>        break;

AD>    numBytesRead += n;
AD>    numBytesToRead -= n;
AD>}
AD>file.Close();


AD>string str = "";

AD>using (MemoryStream ms = new MemoryStream())
AD>{
AD>    using (ZipOutputStream gzs = new ZipOutputStream(ms))
AD>    {
AD>        //gzs.UseZip64 = UseZip64.Off;
AD>        ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
AD>        gzs.PutNextEntry(entry);
AD>        //using (StreamWriter sw = new StreamWriter(gzs))
AD>        //{
AD>        //    sw.Write(Encoding.UTF8.GetString(bytes));
AD>        //}
AD>        gzs.Write(bytes, 0, bytes.Length);

AD>    }
AD>    str = Convert.ToBase64String(ms.ToArray());
AD>}

AD>FileStream zipfile = new FileStream("test.zip", FileMode.Create);
AD>byte[] zipbytes = Convert.FromBase64String(str);
AD>zipfile.Write(zipbytes, 0, zipbytes.Length);
AD>zipfile.Close();
AD>



AD>Для того что бы в архиве оставалось имя файла использую SharpZipLib библиотеку. что инетересно с простым текстовым файлом — все работает.

AD>Подскажите ошибку.
AD>Спасибо.

Попробуйте вызвать gzs.Finish() после записи.
Re: zip doc file - получаю битый архив
От: gagabu Украина  
Дата: 01.08.11 15:08
Оценка: 1 (1)
Здравствуйте, Alex Dav, Вы писали:

Ваш тестовый пример у меня отлично работает — на выходе получаю архив с моим файлом. Возможно, вы что-то теряете, когда передаете по сети?
Re[2]: zip doc file - получаю битый архив
От: Alex Dav Россия  
Дата: 01.08.11 15:33
Оценка:
Здравствуйте, gagabu, Вы писали:

G>Ваш тестовый пример у меня отлично работает — на выходе получаю архив с моим файлом. Возможно, вы что-то теряете, когда передаете по сети?

А вы попробуйте открыть его
Re[3]: zip doc file - получаю битый архив
От: Alex Dav Россия  
Дата: 01.08.11 15:37
Оценка:
Здравствуйте, Alex Dav, Вы писали:

AD>Здравствуйте, gagabu, Вы писали:


G>>Ваш тестовый пример у меня отлично работает — на выходе получаю архив с моим файлом. Возможно, вы что-то теряете, когда передаете по сети?

AD>А вы попробуйте открыть его

Хотя, да — смотря чем открывать — 7zip без проблем — WinRar дает ошибку указанные
Re[2]: zip doc file - получаю битый архив
От: Alex Dav Россия  
Дата: 01.08.11 15:39
Оценка:
Здравствуйте, Gremlin2, Вы писали:

G>Попробуйте вызвать gzs.Finish() после записи.



Спасибо добавил. WinRar продолжает ругаться, 7zip работает без вопросов.
Re[3]: zip doc file - получаю битый архив
От: Gremlin2 http://www.fb2library.net/
Дата: 01.08.11 16:13
Оценка: 4 (1)
Здравствуйте, Alex Dav, Вы писали:

AD>Здравствуйте, Gremlin2, Вы писали:


G>>Попробуйте вызвать gzs.Finish() после записи.



AD>Спасибо добавил. WinRar продолжает ругаться, 7zip работает без вопросов.


Есть ещё такой вариант:
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                            using (ZipFile zFile = ZipFile.Create(memoryStream))
                            {
                                zFile.UseZip64 = UseZip64.Off;

                                zFile.BeginUpdate();
                                zfile.Add(file.Name);
                                zFile.CommitUpdate();
                            }
                    }
Re[4]: есть решение
От: Alex Dav Россия  
Дата: 01.08.11 16:20
Оценка:
Здравствуйте, Gremlin2, Вы писали:

G>Есть ещё такой вариант:

G>
G>                    using (MemoryStream memoryStream = new MemoryStream())
G>                    {
G>                            using (ZipFile zFile = ZipFile.Create(memoryStream))
G>                            {
G>                                zFile.UseZip64 = UseZip64.Off;

G>                                zFile.BeginUpdate();
G>                                zfile.Add(file.Name);
G>                                zFile.CommitUpdate();
G>                            }
G>                    }
G>


Эта строчка решила проблему и моем коде
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.