GZipStream. Сжатие, распаковка файла. - C#
Формулировка задачи:
Народ помогите разобраться, вот правильно ли я сжимаю и разжимаю файлы? Просто например WinRar не может распаковать такой сжатый файл, так как пишет, что файл повреждён. А когда упаковываю, а потом распаковываю, то почему-то всё нормально. Файл после распаковки открывается. Размер остаётся тем же, что и до сжатия.
И я вот, что ещё хотел спросить. А как добавлять инфу о файле? Может в конец файла записывать экземпляр FileInfo или создать свой класс, какой нибудь для этих целей написать?
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); } } } } }
Появился более конкретный вопрос. Почему этот код упаковывает, но не правильно распаковывает именно текстовые файлы?
//Начать сжатие 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); }
Вот чуть подправил на скорую руку:
//Начать сжатие 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); }
Решение задачи: «GZipStream. Сжатие, распаковка файла.»
textual
Листинг программы
Path.ChangeExtension("gz");
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д