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");