Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание zip архива через GZipStream / 16 сообщений из 16, страница 1 из 1
19.03.2013, 11:32
    #38189251
Core12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
Всем доброго времени суток.
Столкнулся с небольшой проблемой, есть папка следующей структуры
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
19.03.2013, 13:22
    #38189579
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
Core12,

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

И с MSDN:
Сжатые объекты GZipStream, записанные в файл с расширением .gz, можно распаковать с помощью которых можно решить многие стандартные средства сжатия; однако по существу этот класс не предоставляет функциональность добавления файлов или извлекать файлы из ZIP-архива.
...
Рейтинг: 0 / 0
19.03.2013, 13:54
    #38189692
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
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
19.03.2013, 14:05
    #38189729
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
beg-in-er,

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

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

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

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

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

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

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

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

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

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

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

авторПосмотри на досуге возможности объектной модели 7z,
зачем использовать объектную модель там, где она излишне? где всё чётко -алгоримизированно - взял то - и положил туда.
но....сколько людей , столько и мнений.
МСУ нравятся объекты, вперёд,
я же считаю,уверен, что массовое применение ООП это зло. и где можно , оно легко и непринуждённо заменяется на статик методы.
...
Рейтинг: 0 / 0
22.03.2013, 01:00
    #38194128
Core12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
Спасибо, за советы выбрал 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
22.03.2013, 01:05
    #38194133
Core12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание zip архива через GZipStream
Вопрос самоликвидировался, надо было объявлять в начале работы с архивом а не в конце)).
Что поделать время час ночи голова уже не варит.... пора спать.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание zip архива через GZipStream / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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