-1

我正在编写代码以使用内置的 .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”吗?

4

2 回答 2

1

按照 FrankJames 建议的链接,这是创建 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();
                }
            }
        }
于 2020-12-20T21:27:15.393 回答
0

我看到您从未使用过强制写入流的 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;
    }
于 2020-12-20T20:48:51.813 回答