powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# помогите с созданием Zip архива
25 сообщений из 28, страница 1 из 2
C# помогите с созданием Zip архива
    #38862464
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребятки, может кто подскажет где копать?
Теоретически всё работает, WinRAR показывает имена файлов, размер и сжатый размер.
Но не распаковывает - говорит кривой архив. :(
Visual Studio 2013.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
using System.IO;
using System.IO.Compression;

void createArchive()
{
    // create new zipArchive in memory. leave it open.

    MemoryStream ms = new MemoryStream();
    ZipArchive archive = new ZipArchive(ms, ZipArchiveMode.Create, true);

    // add results to archive         

            while (myDR.Read())
            {
                result_name = (String)myDR[0];
                result_size = (long)myDR[1];
                result_binary_data = (Byte[])myDR[2];
                AddResultToArchive(ref archive, result_name + ".out", ref result_binary_data);
             }

  // create archive completed, insert archive into dbo.Download
            
            Byte[] archive_as_binary_data = ms.ToArray();
            ms.Dispose();

           String cmd= "INSERT into dbo.Download archive_name, binary_data...";
           sqlCommand.Execute(cmd);
}

 // create archive entry, write result binary data to entry

        void AddResultToArchive(ref ZipArchive zipArchive, String result_name, ref byte[] result_binary_data)
        {
            ZipArchiveEntry resultEntry = zipArchive.CreateEntry(result_name);
            using (BinaryWriter binWriter = new BinaryWriter(resultEntry.Open()))
            {
                binWriter.Write(result_binary_data, 0, result_binary_data.Length);
            }
        }
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862466
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal,

Файлик то приложите. Телепатов тут нет. Ну и есть еще класс ZipFile
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862467
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79SerVal,

Файлик то приложите. Телепатов тут нет. Ну и есть еще класс ZipFile
+ у вас может быть GZip - это GZipStream/

Ну и на всякий случай этот код рабочий именно для Zip:
Код: c#
1.
2.
3.
4.
5.
using (var ms = new MemoryStream(args.Result))
using (var archive = new ZipArchive(ms, ZipArchiveMode.Read))
using (var stream = archive.GetEntry("export.xml").Open())
using (var fs = new FileStream(AllProperties.file, FileMode.Create, FileAccess.Write))
  stream.CopyTo(fs);
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862475
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Файлик то приложите. Телепатов тут нет. Ну и есть еще класс ZipFile

Приложил.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862477
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Ну и на всякий случай этот код рабочий именно для Zip...
Этот код не создаёт архив, а читает. :(
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862481
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, точно, не въехал сразу. Так вот:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            using (FileStream fileStream = new FileStream("tst.zip", FileMode.Create, FileAccess.Write))
            {
                using (ZipArchive pZipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, false))
                {
                    ZipArchiveEntry entry = pZipArchive.CreateEntry("qwerty1.txt", CompressionLevel.Optimal);
                    using (StreamWriter wr = new StreamWriter(entry.Open()))
                    {
                        wr.WriteLine("Information about this package.");
                        wr.WriteLine("========================");
                    }
                }
            }



А ошибка у вас в том, что ZipArchive - это Disposable. И после "ZipArchiveEntry resultEntry = zipArchive.CreateEntry(result_name); " ссылок не встречается. Чистится память. Dispose ему делайте после окончания цикла While
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862485
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal, у меня данный код создает архив который WinRAR открывает без ошибок. Возможно ты делаешь что-то не так при записи в БД или чтении из нее.

P.S. Функция AddResultToArchive использует ref параметров которые не нужны. Кроме этого для записи массива нет нужды создавать BinaryWriter т.к. resultEntry.Open() возвращает Stream умеющий это делать. Поэтому можно переписать так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
void AddResultToArchive(ZipArchive zipArchive, string result_name, byte[] result_binary_data)
{
	ZipArchiveEntry resultEntry = zipArchive.CreateEntry(result_name);
	using (var entryStream = resultEntry.Open())
	{
		entryStream.Write(result_binary_data, 0, result_binary_data.Length);
	}
}
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862486
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за отклик. *микрософтовские примеры я уже все перелопатил.

Arm79А ошибка у вас в том, что ZipArchive - это Disposable. И после "ZipArchiveEntry resultEntry = zipArchive.CreateEntry(result_name); " ссылок не встречается. Чистится память. Dispose ему делайте после окончания цикла While

Что-то не могу понять, что надо делать. :(
Память вроде бы нигде не чистится. Я сам её удаляю: ms.Dispose();
Сейчас попробую Dispose для архива после окончания цикла While.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862491
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79 , Ура!!!
archive.Dispose() после while() - помогло. Больше ничего не менял. Вы умница. Огромное спасибо.
У WinRar-а и контрольные суммы появились. :)
Сейчас попробую закатать 100 тыс. в архив, но думаю, что всё будет ок.

bazileФункция AddResultToArchive использует ref параметров которые не нужны. Кроме этого для записи массива нет нужды создавать BinaryWriter т.к. resultEntry.Open() возвращает Stream умеющий это делать. Поэтому можно переписать так: ..

А что такое "var"? Нельзя ли вместо неё подставить конкретный тип?
Я не использую переменные неопределённого типа. Сейчас это модно, но у меня только строгая типизация.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862492
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 bazile :
А почему не надо передавать массивы по ссылке?
По значению я их никогда не передавал. StringBuilder тоже по ссылке везде передаю. И строки большого размера.

*у меня много таких мест, вот и интересуюсь.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862493
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValarchive.Dispose() после while() - помогло. Больше ничего не менял. Вы умница. Огромное спасибо.
Конечно я умница. Не за что.

SerValА что такое "var"? Нельзя ли вместо неё подставить конкретный тип?
var - это и есть конкретный тип. Это строгая типизация.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862494
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal2 bazile :
А почему не надо передавать массивы по ссылке?
По значению я их никогда не передавал. StringBuilder тоже по ссылке везде передаю. И строки большого размера.

*у меня много таких мест, вот и интересуюсь.
По ссылке передают обычно value-типы, например struct или long.
Массив, строка, класс - это и есть ссылка. Дополнительно нет смысла, хотя можно
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862497
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79var - это и есть конкретный тип. Это строгая типизация.
Спасибо, наверное я отстал от жизни.
Просто после того как увидел в C# нечто подобное:

Код: c#
1.
2.
3.
var a = 2;
var b = 3;
var c = a/b;


Мне стало как-то не по себе. Какого типа "с" я понять не в состоянии. :(
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862500
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValArm79var - это и есть конкретный тип. Это строгая типизация.
Спасибо, наверное я отстал от жизни.
Просто после того как увидел в C# нечто подобное:

Код: c#
1.
2.
3.
var a = 2;
var b = 3;
var c = a/b;



Мне стало как-то не по себе. Какого типа "с" я понять не в состоянии. :(
в данном случае все три - это int :-)

Вот если один из первых будет объявлен как double, то с - тоже double. Или так: var c = 1.00 * a/b (здесь тоже double
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862529
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal,

Implicitly Typed Local Variables (C# Programming Guide)
It is important to understand that the var keyword does not mean "variant" and does not indicate that the variable is loosely typed, or late-bound. It just means that the compiler determines and assigns the most appropriate type.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862530
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValСпасибо, наверное я отстал от жизни
На 7 лет. var появился в 3-м фреймворке.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862579
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо, самое хорошее решение, это использование 7z.dll, максимальный уровень сжатия, отличная скорость, поддержка нескольких форматов, ну да сами знаете. Встроенный Zip в .NET убог, медлителен и вообще ужасен
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862604
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Нет понятия - самое хорошее. Есть - наиболее подходящее для заданных условий. 7z - это неуправляемый код, не вижу смысла с ним разбираться, если учесть что это web. Нет ни требований по максимальному быстродействию, ни по поддержке разных форматов. В этом случае несколько строк кода и штатные возможности предпочтительнее
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862608
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

понятно, что выбор обусловлен множеством критериев. Я лишь привёл 1 из вариантов.
К примеру в 1 из моих проектов объём сжимаемых данных может превышать 40 гб и сжать такой объём средствами .NET вообще невозможно.
Я предложил, остальное дело за автором. Ему виднее, что для него важнее.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862632
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm797z - это неуправляемый код, не вижу смысла с ним разбираться, если учесть что это web. Нет ни требований по максимальному быстродействию, ни по поддержке разных форматов. В этом случае несколько строк кода и штатные возможности предпочтительнее
+1
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862672
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesимхо, самое хорошее решение, это использование 7z.dll
Использую 7z.dll для входящих архивов по 200-400 тыс. файлов.
Народ недоволен тем, что не видит прогресс распаковки. Распаковка "замораживает" вэб страницу на 1-2 минуты.
После чего пользователь видит прогресс добавления файлов в базу.
А народ сразу хочет видеть, что "процесс пошёл". :)

*но "жмёт" 7z лучше zip-а.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862693
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal,

ну я не шарю в вебе, в толстом с прогрессом архивации у меня проблем не было
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862716
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValRoman Mejtesимхо, самое хорошее решение, это использование 7z.dll
Использую 7z.dll для входящих архивов по 200-400 тыс. файлов.
Народ недоволен тем, что не видит прогресс распаковки. Распаковка "замораживает" вэб страницу на 1-2 минуты.
После чего пользователь видит прогресс добавления файлов в базу.
А народ сразу хочет видеть, что "процесс пошёл". :)

*но "жмёт" 7z лучше zip-а.
Никто не спорит, что 7z компактнее, чем zip. Зато zip - универсальнее :-)
А кто вам мешает при чтении архива на 400 тысяч файлов делать progress на каждые, скажем, 10 000 файлов? SignalR в помощь...
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862817
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Arm79]
SerValпропущено...
А кто вам мешает при чтении архива на 400 тысяч файлов делать progress на каждые, скажем, 10 000 файлов? SignalR в помощь...

Так файлов-то нетути. Читается в память, в ней же и разархивируется. Всё равно же в базу добавлять.
Зачем файлы? Их потом делетить надобно... ну их.
...
Рейтинг: 0 / 0
C# помогите с созданием Zip архива
    #38862826
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

7z умеет жать в стандартный zip
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# помогите с созданием Zip архива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]