Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/74: Рейтинг темы: голосов - 74, средняя оценка - 4.93
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

GZipStream. Сжатие, распаковка файла.

11.01.2011, 02:08. Показов 15499. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ помогите разобраться, вот правильно ли я сжимаю и разжимаю файлы? Просто например WinRar не может распаковать такой сжатый файл, так как пишет, что файл повреждён. А когда упаковываю, а потом распаковываю, то почему-то всё нормально. Файл после распаковки открывается. Размер остаётся тем же, что и до сжатия.

И я вот, что ещё хотел спросить. А как добавлять инфу о файле? Может в конец файла записывать экземпляр FileInfo или создать свой класс, какой нибудь для этих целей написать?

Класс GZip (нажмите, чтобы развернуть)
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
using System.IO;
using System.IO.Compression;
.............
.............
 
    public class GZip
    {
        public static void Compress(String fileSource, String fileDestination, int bufferSize)
        {
            using (FileStream fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    GZipStream gzipStream = new GZipStream(fsOutput, CompressionMode.Compress);
                    Byte[] buffer = new Byte[bufferSize];
                    int h;
 
                    while ((h = fsInput.Read(buffer, 0, bufferSize)) != 0)
                    {
                        gzipStream.Write(buffer, 0, h);
                    }
                }
            }
        }
 
        public static void Decompress(String fileSource, String fileDestination, int bufferSize)
        {
            using (FileStream fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    GZipStream gzipStream = new GZipStream(fsInput, CompressionMode.Decompress);
                    Byte[] buffer = new Byte[bufferSize];
                    int h;
 
                    while ((h = gzipStream.Read(buffer, 0, bufferSize)) != 0)
                    {
                        fsOutput.Write(buffer, 0, h);
                    }
                }
            }
        }
    }


Добавлено через 5 часов 41 минуту
Появился более конкретный вопрос. Почему этот код упаковывает, но не правильно распаковывает именно текстовые файлы?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        //Начать сжатие
        private void btnStartPack_Click(object sender, RoutedEventArgs e)
        {
            FileInfo fi = new FileInfo(this.textBoxFilePath.Text);
            String compressedFile = fi.FullName +".gz";
            String decompressedFile = GetFileNameWithoutExtension(compressedFile);
            String part2 = GetFileNameWithoutExtension(decompressedFile);
            decompressedFile = part2 + "_.txt";
 
            GZip.CompressFile(this.textBoxFilePath.Text, compressedFile, 2048);
            GZip.DecompressFile(compressedFile, decompressedFile, 2048);
        }
 
        private String GetFileNameWithoutExtension(String FileName)
        {
            FileInfo fi = new FileInfo(FileName);
            int realLengthFileName = fi.FullName.Length - fi.Extension.Length;
            return fi.FullName.Substring(0, realLengthFileName);
        }
Добавлено через 11 минут
Вот чуть подправил на скорую руку:

Тот же код немного подправленный
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        //Начать сжатие
        private void btnStartPack_Click(object sender, RoutedEventArgs e)
        {
            FileInfo fi = new FileInfo(this.textBoxFilePath.Text);
            String compressedFile = fi.FullName +".gz";
            String decompressedFile = GetFileNameWithoutExtension(compressedFile);
            String part2 = GetFileNameWithoutExtension(decompressedFile);
 
            decompressedFile = decompressedFile.Insert(part2.Length, "_");
 
            GZip.CompressFile(this.textBoxFilePath.Text, compressedFile, 2048);
            GZip.DecompressFile(compressedFile, decompressedFile, 2048);
        }
 
        private String GetFileNameWithoutExtension(String FileName)
        {
            FileInfo fi = new FileInfo(FileName);
            int realLengthFileName = fi.FullName.Length - fi.Extension.Length;
            return fi.FullName.Substring(0, realLengthFileName);
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.01.2011, 02:08
Ответы с готовыми решениями:

GZipStream - параллельная распаковка файла большого размера
Всем привет! Проблема отображена в названии темы. С сжатием всё понятно: читаем кусочки файлов отдельным потоком, несколькими потоками эти...

GZipStream проблема с раширением файла в архиве
Добрый день, появилась проблема при сжатии файла. Когда сжимается, пропадает точка расширения файла. Даже не представляю почему. Вместо...

При сжатии GZipStream размер выходного файла больше оригинала
Привет! гугл особо не помог по теме, хотя такую проблему встречал: при сжатии с помощью GZipStream на .net 3.5 выходной файл по размеру...

5
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
11.01.2011, 04:01
Чего-то я вроде там допилил, хотя кажись и так все нормально читалось
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
    public class GZip
    {
        public static void Compress(String fileSource, String fileDestination)
        {
            using (FileStream fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    using (GZipStream gzipStream = new GZipStream(fsOutput, CompressionMode.Compress))
                    {
                        Byte[] buffer = new Byte[fsInput.Length];
                        int h;
                        while ((h = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            gzipStream.Write(buffer, 0, h);
                        }
                    }
                }
            }
        }
 
        public static void Decompress(String fileSource, String fileDestination)
        {
            using (FileStream fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (FileStream fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    using (GZipStream gzipStream = new GZipStream(fsInput, CompressionMode.Decompress))
                    {
                        Byte[] buffer = new Byte[fsInput.Length];
                        int h;
                        while ((h = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            fsOutput.Write(buffer, 0, h);
                        }
                    }
                }
            }
        }
    }
проверил так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            string sourcePath = "you_path";
         
            string compressed = Path.ChangeExtension(sourcePath, "gz");
            string decompressed = sourcePath.Insert(sourcePath.Length - 4, "_");
 
            GZip.Compress(sourcePath, compressed);
            GZip.Decompress(compressed, decompressed);
 
            string str1 = File.ReadAllText(sourcePath);
            string str2 = File.ReadAllText(decompressed);
 
            if (!str1.Equals(str2))
            {
                Debugger.Break();
            }
И кстати 7zip распаковывает успешно
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
11.01.2011, 07:17  [ТС]
C#
1
Byte[] buffer = new Byte[fsInput.Length];
А если фильм сжимать, это ж сколько оперативки надо. Или я не понимаю чего-то? Странно, так то работает. Но почему нельзя по частям сжимать? То есть читать из файла и писать в другой файл по 2048 килобайт скажем?

Добавлено через 3 минуты
Фильмы не сжимает. Вылетает исключение.
Выдано исключение типа "System.OutOfMemoryException".
Это при создании массива, как раз в той самой строке. А вот по частям всё равно не хочет, то есть прошлый код как не работал так и не работает (в плане распаковки правильной *.txt файлов)
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
11.01.2011, 11:28
Да можно и по частям, на счет фильмов как-то не подумал

Сделал так с буфером
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
        public static void Compress(String fileSource, String fileDestination, int buffsize)
        {
            using (var fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (var fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    using (var gzipStream = new GZipStream(fsOutput, CompressionMode.Compress))
                    {
                        var buffer = new Byte[buffsize];
                        int h;
                        while ((h = fsInput.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            gzipStream.Write(buffer, 0, h);
                        }
                    }
                }
            }
        }
 
        public static void Decompress(String fileSource, String fileDestination, int buffsize)
        {
            using (var fsInput = new FileStream(fileSource, FileMode.Open, FileAccess.Read))
            {
                using (var fsOutput = new FileStream(fileDestination, FileMode.Create, FileAccess.Write))
                {
                    using (var gzipStream = new GZipStream(fsInput, CompressionMode.Decompress))
                    {
                        var buffer = new Byte[buffsize];
                        int h;
                        while ((h = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            fsOutput.Write(buffer, 0, h);
                        }
                    }
                }
            }
        }

И txt вполне нормально разжимаются и фильмы, хотя фильмы в сжатом виде больше места занимают )
2
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
11.01.2011, 19:47  [ТС]
По моему это почти один в один, то что я выложил в первом сообщении. Но в любом случае спасибо!
Для меня ещё оказалось и это полезным. Ну не доводилось мне IntelleSens'ом посмотреть весь список методов.
C#
1
Path.ChangeExtension("gz");
Добавлено через 2 часа 12 минут
А, всё понял свою ошибку. Я не освобождал gzipStream после упаковки и распаковки! Я читал где-то, что пока не освободишь, правильно не сожмётся (примерно так). Вот не заметил этого. Ещё раз спасибо. Теперь всё распаковывается нормально. Видимо проблема была с txt из-за маленького размера файла. То есть при распаковке не скидывалось на HDD, то что распаковалось, так как я не освобождал поток, короче не вызывался метод Flush();
0
1 / 1 / 0
Регистрация: 04.05.2017
Сообщений: 5
03.08.2017, 07:56
Добрый день!

Нужна ваша помощь! У меня практически такое же задание, но малость отличается от вашего. Программа должна эффективно распараллеливать и синхронизировать обработку блоков в многопроцессорной среде и уметь обрабатывать файлы, размер которых превышает объем доступной оперативной памяти. При работе с потоками допускается использовать только стандартные классы и библиотеки из .Net 3.5 (исключая ThreadPool, BackgroundWorker, TPL). Ожидается реализация с использованием Thread-ов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.08.2017, 07:56
Помогаю со студенческими работами здесь

Сжатие AVI файла
Здравствуйте. Столкнулся с проблемкой. Я пробую записать Image в AVI файл. Использую AForge.Video.VFW; Все вроде бы хорошо,...

Сжатие/распаковка GZipStream (net 3.5) на всех ядрах
Доброго времени суток всем. Недавно начал искать работу джуниором, нашёл вакансию, предложили выполнить тестовое задание. От части...

Сжатие и распаковка (текстового)файла [Gz]
Суть проблемы такова. Есть 2 метода: для сжатия файла(данных) static void zip(string inFileName, string outFileName) { ...

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru