powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание zip архива через GZipStream
16 сообщений из 16, страница 1 из 1
Создание zip архива через GZipStream
    #38189251
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток.
Столкнулся с небольшой проблемой, есть папка следующей структуры
RootFolder
-> Folder-> Sub_Files
-> File
Задача состоит в том что бы с использованием GZipStream создать zip архив аналогичной структуры, исключая RootFolder. Как положить файл в архив ясно, код уже написан
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
            FileStream sourceFile = File.OpenRead(@"D:\Work\temp");
            FileStream destFile = File.Create(@"C:\sample.zip");

            GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);

            try
            {
                int theByte = sourceFile.ReadByte();
                while (theByte != -1)
                {
                    compStream.WriteByte((byte)theByte);
                    theByte = sourceFile.ReadByte();
                }
            }
            finally
            {
                compStream.Dispose();
            } 



А вот как в этот архив положить папку Folder с ее содержимым, и возможно ли это в принципе в этом проблема.
Желательно скинуть кусок кода, который поможет в решении данной проблемы.
Заранее спасибо.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189579
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Core12,

Я вам лучше скину кусок вики:
В соответствии с традициями UNIX-программирования, gzip выполняет только две функции: сжатие и распаковка одного файла, он не умеет упаковывать несколько файлов в один архив. При сжатии к оригинальному расширению файла добавляется суффикс .gz. Для упаковки нескольких файлов обычно их сначала архивируют в один файл утилитой tar, а потом этот файл сжимают gzip. Таким образом, сжатые архивы обычно имеют двойное расширение .tar.gz или сокращённое .tgz.

И с MSDN:
Сжатые объекты GZipStream, записанные в файл с расширением .gz, можно распаковать с помощью которых можно решить многие стандартные средства сжатия; однако по существу этот класс не предоставляет функциональность добавления файлов или извлекать файлы из ZIP-архива.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189692
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Core12,

вот кусок кода , который принимает на вход зип-архив и дербанит его на массив архивов и с подпапками и прочим.
вам надо сделат наоборот.
ну это если есть желание руками дотошно в этом разобраться.
все параметры взяты из описания зип-формата.

Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
    
    public class ZIPFILE
    {
        public int UNCOMP_SZ;
        public string FILE;
        public byte[] BB;
    }

       public unsafe ZIPFILE[] L2(byte[] BB)
       {
           int sNotEND = 0x04034b50;
           int sEND = 0x02014B50;
           
           int OFF = 0;
           int N = 0,N2;
           int START_N;
           List<ZIPFILE> BL = new List<ZIPFILE>();
           fixed (byte* B = BB)
           {
           METKA:
               ZIPFILE ZIP = new ZIPFILE();
               OFF = N;
               int flen = *((ushort*)(B + 26 + OFF));
               //РАЗМЕР НУЖЕН ДЛЯ МАССИВА ДЕКОМПРЕССИИ
               ZIP.UNCOMP_SZ = *((int*)(B + 22 + OFF));
               string F_NAME = Encoding.ASCII.GetString(BB, 30 + OFF, flen).Replace('/','_');
               COMP_SZ = *((int*)(B + 18 + OFF));
               START_N = 30 + flen + OFF;
               N = START_N + COMP_SZ;
               while (true)
               {
                   N2 = *((int*)(B+N));
                   if (N2 == sNotEND || N2 == sEND)
                   {
                       //ЕСЛИ ПЕРВЫЙ СИМВОЛ ПРОБЕЛ , ТО НАДО СМЕСТИТЬСЯ
                       if (BB[START_N] == 32)
                           START_N += 4+ *((ushort*)(B + START_N + 2));
                       ZIP.BB=new MemoryStream(BB, START_N, N - START_N).ToArray();
                       ZIP.FILE = F_NAME;
                       BL.Add(ZIP);
                       if (N2==sNotEND)      goto METKA;
                       break;
                   }
                   N++; 

               }

           }
           return BL.ToArray();
       }
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189729
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er,

Может проще воспользоваться http://dotnetzip.codeplex.com/DotNetZip например?
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189731
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://dotnetzip.codeplex.com/]DotNetZip
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189734
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DotNetZip

Бог любит троицу.. )
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189790
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchbeg-in-er,

Может проще воспользоваться http://dotnetzip.codeplex.com/DotNetZip например?

да всяк проще пользоваться чужими решениями, а не разбиратся детально.
лично мне было интересно сделать как то самому.
просто если мы каждый раз будем пользоваться готовыми решениями, то это отобъёт и желание и умениее делать самостоятельно.
и когда появится задача, которая ещё никем не сделана, то тогда может наступить "веселья" час.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189809
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er,

но с другой стороны, отвлекаясь на простые задачи и изобретая свои велосипеды, мы теряем время, которое можно потратить на решение сложной задачи..) ИМХО.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38189843
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchbeg-in-er,

но с другой стороны, отвлекаясь на простые задачи и изобретая свои велосипеды, мы теряем время, которое можно потратить на решение сложной задачи..) ИМХО.

так то да, должон быть баланс.
но всё таки если сконцентрироваться только на решении "сложных" задач, то можно запросто оторваться от базиса, и тогда сложность задач будет сама по себе порождать сложность. по спирали. и в итоге получится неуправляемый каркас классов, фабрик, интерфейсов, методов..... и будут тратится силы на взаимодействия между ними.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38190014
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-er, жесть какая-то...

http://codearticles.ru/home/catalogs/251
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38190032
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Спасибо за ссылку, не знал что в 4.5 появился Zip архив.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38190050
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУbeg-in-er, жесть какая-то...
Где ты там жесть нашёл? goto не по-нраву?
нормальная реализация метода. да, можно причесать, убрать готу, но смысл не сменится.
тут чётко виден алгоритм декомпресии вложенного архива.
имя, размер, стопбит....
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38190088
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erГде ты там жесть нашёл? goto не по-нраву?
unsafe, goto, magic numbers.

beg-in-erнормальная реализация метода
Ну если ты считаешь "это" нормальной реализацией, то в путь.

P.S. Посмотри на досуге возможности объектной модели 7z, http://codearticles.ru/home/articleview/1101
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38190111
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ magic numbers.
это не ко мне , это вопрос к создателям формата. почему для стоп-байт они выбрали именно эти значения.

авторПосмотри на досуге возможности объектной модели 7z,
зачем использовать объектную модель там, где она излишне? где всё чётко -алгоримизированно - взял то - и положил туда.
но....сколько людей , столько и мнений.
МСУ нравятся объекты, вперёд,
я же считаю,уверен, что массовое применение ООП это зло. и где можно , оно легко и непринуждённо заменяется на статик методы.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38194128
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, за советы выбрал DotNetZip. Доволен как слон.
Только столкнулся с одной проблемой русские буквы в конечном архиве отображаются некорректно, а именно вот так "_".
Пробовал прописать ему кодировку
Код: c#
1.
2.
3.
                zip.AlternateEncoding = Encoding.GetEncoding(Console.OutputEncoding.CodePage); 
                //zip.ProvisionalAlternateEncoding = Encoding.GetEncoding(Console.OutputEncoding.CodePage);
                zip.AlternateEncodingUsage = ZipOption.Always;



а также пляски с бубном вокруг Encoding.Default, и прочих вариаций результата не дали.
У кого есть какие мысли на этот счет.
...
Рейтинг: 0 / 0
Создание zip архива через GZipStream
    #38194133
Core12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос самоликвидировался, надо было объявлять в начале работы с архивом а не в конце)).
Что поделать время час ночи голова уже не варит.... пора спать.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание zip архива через GZipStream
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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