Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
9 / 9 / 2
Регистрация: 17.03.2014
Сообщений: 30

GZipStream

22.11.2014, 22:05. Показов 2244. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть вопроса вот в чем, есть данный код, который сжимает по одиночке все файлы, которые находятся в папке, создавая для каждого файла свой архив, как сделать так, чтобы сжимало всю папку целиком, в 1 фаил.

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
namespace Console
{
    class Program
    {
        static void Main(string[] args)
        {
            string directoryPath = @"d:\csharpfiles";
            DirectoryInfo directorySel = new DirectoryInfo(directoryPath);
 
            foreach (FileInfo FileToCompress in directorySel.GetFiles())
            {
                Compress(FileToCompress);
            }
            
        }
        public static void Compress(FileInfo FileToCompress)
        {
            using (FileStream origFileStream = FileToCompress.OpenRead())
            {
                if ((File.GetAttributes(FileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & FileToCompress.Extension != ".rar")
                {
                    using (FileStream compressedFileStream = File.Create(FileToCompress.FullName + ".rar"))
                    {
                        using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
                        {
                            origFileStream.CopyTo(compressionStream);
                            System.Console.WriteLine("Compressed {0} from {1} to {2} bytes.",FileToCompress.Name,FileToCompress.Name.ToString(),compressedFileStream.Length.ToString());
                            System.Console.ReadLine();
                        }
                    }
                }
            }
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2014, 22:05
Ответы с готовыми решениями:

Создать поток сжатия GZipStream, и перенести данные из открытого файла в поток GZipStream
Здравствуйте. Объясните мне пожалуйста следующую вещь: Необходимо открыть файл для чтения. Создать поток сжатия GZipStream, и перенести...

Разархивация GZipStream
Нужно разархивировать предварительно заархивированный файл byte decompressedBytes; using (FileStream...

Магические числа GZipStream
Здравствуйте, Проблема в следующем. Я пишу архиватор, который выполняет работу в многопоточном режиме по типу конвейера. Я считываю блок...

5
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,895
Записей в блоге: 1
23.11.2014, 11:16
Alexnwb, если у тебя .NET 4.5, то используй ZipFile.CreateFromDirectory. В предыдущих версиях придется использовать внешнюю библиотеку. Например, SharpZipLib.
0
9 / 9 / 2
Регистрация: 17.03.2014
Сообщений: 30
23.11.2014, 18:37  [ТС]
OwenGlendower, спасибо, на сколько мне известно, я должен передать ссылку на массив, чтобы разбить по байтово все что находится в папке, а потом это все в 1 архив закинуть, примерно как-то так
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,895
Записей в блоге: 1
23.11.2014, 19:07
Alexnwb, ты хочешь сделать собственный формат архива?
0
9 / 9 / 2
Регистрация: 17.03.2014
Сообщений: 30
23.11.2014, 21:06  [ТС]
OwenGlendower, да, именно, но незнаю как это реализовать
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18292 / 14216 / 5368
Регистрация: 17.03.2014
Сообщений: 28,895
Записей в блоге: 1
23.11.2014, 23:36
Лучший ответ Сообщение было отмечено Alexnwb как решение

Решение

Alexnwb, нет проблем. Чтобы распаковать архив нам нужно знать сколько файлов в архиве, их имена и длину. Делаем такую структуру файла: создаем новый файл, пишем 4 нуля в начале, затем записываем друг за другом сжатые файлы. Во время этого процесса заполняем такой класс:
C#
1
2
3
4
5
class ArchiveEntry
{
    public string Path;
    public int CompressedLength;
}
Экземпляры ArchiveEntry складываем в List<ArchiveEntry>. Когда все файлы будут добавлены в архив мы запоминаем текущую длину потока (позже мы запишем её в начало файла где мы оставили 4 нуля). Теперь берем BinaryWriter, записываем в поток кол-во элементов в списке, и затем для каждого ArchiveEntry пишем все его поля. И наконец возвращаемся в начало файла и записываем ранее сохраненную позицию, которая по сути указывает на нашу таблицу файлов.

При распаковке мы читаем (с помощью BinaryReader) смещение типа int и двигаем позицию файла туда. Теперь снова читаем int с кол-вом файлов в архиве и создаем List<ArchiveEntry>(N) или ArchiveEntry[N]. Далее читаем в том же порядке в котором записывали поля класса ArchiveEntry и добавляем его в коллекцию. Это мы получили наш список файлов. Т.к. для каждого файла мы запомнили его длину, то мы можем прочитать из входного потока нужное кол-во байтов. Метод CopyTo() уже не получится использовать т.к. он копирует поток целиком. Тем не менее написать простой цикл не составит труда. Таким образом мы будем двигаться по нашему архиву и распаковывать файлы один за другим.

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

P.S. Только сейчас обратил внимание на код функции Compress:
Цитата Сообщение от Alexnwb Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
public static void Compress(FileInfo FileToCompress)
{
    using (FileStream origFileStream = FileToCompress.OpenRead())
    {
        if ((File.GetAttributes(FileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & FileToCompress.Extension != ".rar")
        {
            // пропущено ...
        }
    }
}
Почему ты сначала открываешь файл, а только потом делаешь проверку подойдет он тебе или нет? Это нелогично и заставляет тебя делать лишний отступ. Кроме этого раз твоя функция принимает FileInfo, то почему не использовать его свойство Attributes? Я бы переписал код так:
C#
1
2
3
4
5
6
7
8
9
10
11
public static void Compress(FileInfo FileToCompress)
{
    //if ((File.GetAttributes(FileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & FileToCompress.Extension != ".rar")
    if ((FileToCompress.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden
            && !FileToCompress.Extension.Equals(".rar", StringComparison.OrdinalIgnoreCase))
        return;
    using (FileStream origFileStream = FileToCompress.OpenRead())
    {
        // пропущено ...
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2014, 23:36
Помогаю со студенческими работами здесь

Распаковка с использованием GZipStream
Всем привет. Поставлена задача - используя библиотеку GZipStream, осуществить Multi-Thread упаковку/распаковку. Задача тут описывалась...

Сжатие строк с использованием GZipStream
Вот тут приведены примеры по сжатию строк с использованием GZipStream. Я попытался сделать по аналогии расширяющий метод для string. Вот...

GZipStream архивация частей файла
В общем делю файл на конкретное кол-во байт, но при архивации, части архива разного размера, не тот который я задал. Но если сделать...

GZipStream: Размер архива больше оригинала
Ну, собственно, вопрос в заголовке. Если я архивирую файл с разрешением .avi, .mp3 - архив (.gz) в результате оказывается больше...

GZipStream увеличивает исходный массив байт
Почему при использовании GzipStream увеличивается исходный массив байт? Код: public static void Main(string args) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru