使用C#压缩单个文件

时间:2014-07-30 16:30:30

标签: c# .net zip zipfile

我正在使用.NET 4.5,如果我尝试用“CreateFromDirectory”压缩整个目录,ZipFile类的效果很好。但是,我只想在目录中压缩一个文件。我试着指向一个特定的文件(文件夹\ data.txt),但这不起作用。我考虑过ZipArchive类,因为它有一个“CreateEntryFromFile”方法,但似乎这只允许你创建一个现有文件的条目。

在没有创建空zipfile(有问题)然后使用ZipArchiveExtension的“CreateEntryFromFile”方法的情况下,是否无法简单压缩一个文件?

**这也是假设我正在开发一个目前无法使用第三方附加组件的公司计划。

示例来自:http://msdn.microsoft.com/en-us/library/ms404280%28v=vs.110%29.aspx

        string startPath = @"c:\example\start";
        string zipPath = @"c:\example\result.zip";
        string extractPath = @"c:\example\extract";

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);

但是如果startPath是@"c:\example\start\myFile.txt;",则会抛出该目录无效的错误。

5 个答案:

答案 0 :(得分:39)

使用CreateEntryFromFile关闭存档并使用文件或内存流:

如果您可以创建zip文件然后添加到文件流,请使用文件流:

using (FileStream fs = new FileStream(@"C:\Temp\output.zip",FileMode.Create))
using (ZipArchive arch = new ZipArchive(fs, ZipArchiveMode.Create))
{
    arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

或者如果您需要在内存中执行所有操作并在文件完成后写入文件,请使用内存流:

using (MemoryStream ms = new MemoryStream())
using (ZipArchive arch = new ZipArchive(ms, ZipArchiveMode.Create))
{
    arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

然后你可以write the MemoryStream to a file

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
   byte[] bytes = new byte[ms.Length];
   ms.Read(bytes, 0, (int)ms.Length);
   file.Write(bytes, 0, bytes.Length);
   ms.Close();
}

答案 1 :(得分:22)

使用文件(或任何)流:

using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create))
{
    var entry = zip.CreateEntry("file.txt");
    entry.LastWriteTime = DateTimeOffset.Now;

    using (var stream= File.OpenRead(@"c:\path\to\file.txt"))
    using (var entryStream = entry.Open())
        stream.CopyTo(entryStream);
}

或简短:

// reference System.IO.Compression
using (var zip = ZipFile.Open("file.zip", ZipArchiveMode.Create))
    zip.CreateEntryFromFile("file.txt", "file.txt");

确保添加对System.IO.Compression

的引用

<强>更新

另外,请查看ZipFileZipArchive的新dotnet API文档。那里有几个例子。还有关于引用System.IO.Compression.FileSystem以使用ZipFile的警告。

  

要使用ZipFile类,必须引用   您项目中的System.IO.Compression.FileSystem程序集。

答案 2 :(得分:6)

最简单的方法是使用临时文件夹。

FOR ZIPPING:

  1. 创建临时文件夹
  2. 将文件移至文件夹
  3. Zip文件夹
  4. 删除文件夹
  5. FOR UNZIPPING:

    1. 解压缩档案
    2. 将文件从临时文件夹移至您所在的位置
    3. 删除临时文件夹

答案 3 :(得分:0)

在.NET中,对于单个文件,有很多方法可以解决这个问题。如果你不想学习那里的一切,你可以得到一个抽象的库,比如SharpZipLib(长期开源库),sevenzipsharp(下面需要7zip库)或者DotNetZip。

答案 4 :(得分:0)

只需使用以下代码压缩文件即可。

public void Compressfile()
        {
             string fileName = "Text.txt";
             string sourcePath = @"C:\SMSDBBACKUP";
             DirectoryInfo di = new DirectoryInfo(sourcePath);
             foreach (FileInfo fi in di.GetFiles())
             {
                 //for specific file 
                 if (fi.ToString() == fileName)
                 {
                     Compress(fi);
                 }
             } 
        }

public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and 
                // already compressed files.
                if ((File.GetAttributes(fi.FullName)
                    & FileAttributes.Hidden)
                    != FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file.
                    using (FileStream outFile =
                                File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress =
                            new GZipStream(outFile,
                            CompressionMode.Compress))
                        {
                            // Copy the source file into 
                            // the compression stream.
                            inFile.CopyTo(Compress);

                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

    }