压缩后无效的 C# Zip 文件
Invalid C# Zip File After Compressing
我正在使用内置的 .NET 库在 C# 中编写压缩 ZIP 文件的代码:
使用System.IO.Compression;
使用 System.IO;
但是,但是,当压缩完成时,代码会输出一个无效的 zip 文件。似乎在代码的某处,文件没有正确写入或完全关闭。我已经使用了dispose和close来释放资源。
public bool CompressFile(FileInfo theFile)
{
StringBuilder compressSuccess = new StringBuilder();
FileStream sourceFile = File.OpenRead(theFile.FullName.ToString());
FileStream destinationFile = File.Create(theFile.FullName + ".zip");
byte[] buffer = new byte[sourceFile.Length];
sourceFile.Read(buffer, 0, buffer.Length);
using (GZipStream output = new GZipStream(destinationFile,
CompressionMode.Compress, true))
{
output.Write(buffer, 0, buffer.Length);
}
sourceFile.Dispose();
destinationFile.Dispose();
sourceFile.Close();
destinationFile.Close();
return true;
}
我做错了什么?是因为我强制使用扩展名“.zip”吗?
我看你从来没有使用过强制写入流的 Flush 方法。
我用更好的风格重写了你的代码(使用而不是处置)。
试试看,让我们知道:
public bool CompressFile(FileInfo theFile)
{
using (var sourceStream = File.OpenRead(theFile.FullName))
using (var destStream = File.Create(theFile.FullName + ".zip"))
{
var buffer = new byte[sourceStream.Length];
sourceStream.Read(buffer, 0, buffer.Length);
using (var zipStream = new GZipStream(destStream, CompressionMode.Compress, true))
{
zipStream.Write(buffer, 0, buffer.Length);
zipStream.Flush();
}
destStream.Flush();
}
return true;
}
根据 FrankJames 建议的 link,这是创建 zip 文件的代码示例:
var zipFile = @"e:\temp\outputFile.zip";
var theFile = @"e:\temp\sourceFile.txt";
using (var zipToCreate = new FileStream(zipFile, FileMode.Create))
{
using (var archive = new ZipArchive(zipToCreate, ZipArchiveMode.Create))
{
var fileEntry = archive.CreateEntry("FileNameInsideTheZip.txt");
using (var sourceStream = File.OpenRead(theFile))
using (var destStream = fileEntry.Open())
{
var buffer = new byte[sourceStream.Length];
sourceStream.Read(buffer, 0, buffer.Length);
destStream.Write(buffer, 0, buffer.Length);
destStream.Flush();
}
}
}
我正在使用内置的 .NET 库在 C# 中编写压缩 ZIP 文件的代码:
使用System.IO.Compression; 使用 System.IO;
但是,但是,当压缩完成时,代码会输出一个无效的 zip 文件。似乎在代码的某处,文件没有正确写入或完全关闭。我已经使用了dispose和close来释放资源。
public bool CompressFile(FileInfo theFile)
{
StringBuilder compressSuccess = new StringBuilder();
FileStream sourceFile = File.OpenRead(theFile.FullName.ToString());
FileStream destinationFile = File.Create(theFile.FullName + ".zip");
byte[] buffer = new byte[sourceFile.Length];
sourceFile.Read(buffer, 0, buffer.Length);
using (GZipStream output = new GZipStream(destinationFile,
CompressionMode.Compress, true))
{
output.Write(buffer, 0, buffer.Length);
}
sourceFile.Dispose();
destinationFile.Dispose();
sourceFile.Close();
destinationFile.Close();
return true;
}
我做错了什么?是因为我强制使用扩展名“.zip”吗?
我看你从来没有使用过强制写入流的 Flush 方法。
我用更好的风格重写了你的代码(使用而不是处置)。 试试看,让我们知道:
public bool CompressFile(FileInfo theFile)
{
using (var sourceStream = File.OpenRead(theFile.FullName))
using (var destStream = File.Create(theFile.FullName + ".zip"))
{
var buffer = new byte[sourceStream.Length];
sourceStream.Read(buffer, 0, buffer.Length);
using (var zipStream = new GZipStream(destStream, CompressionMode.Compress, true))
{
zipStream.Write(buffer, 0, buffer.Length);
zipStream.Flush();
}
destStream.Flush();
}
return true;
}
根据 FrankJames 建议的 link,这是创建 zip 文件的代码示例:
var zipFile = @"e:\temp\outputFile.zip";
var theFile = @"e:\temp\sourceFile.txt";
using (var zipToCreate = new FileStream(zipFile, FileMode.Create))
{
using (var archive = new ZipArchive(zipToCreate, ZipArchiveMode.Create))
{
var fileEntry = archive.CreateEntry("FileNameInsideTheZip.txt");
using (var sourceStream = File.OpenRead(theFile))
using (var destStream = fileEntry.Open())
{
var buffer = new byte[sourceStream.Length];
sourceStream.Read(buffer, 0, buffer.Length);
destStream.Write(buffer, 0, buffer.Length);
destStream.Flush();
}
}
}