压缩后无效的 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();
                }
            }
        }