使用C#压缩单个文件

我正在使用.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;" ,它会抛出一个目录无效的错误。

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

用于拉链:

  1. 创建临时文件夹
  2. 将文件移动到文件夹
  3. ZIP文件夹
  4. 删除文件夹

解冻:

  1. 解压缩存档
  2. 将文件从临时文件夹移动到您的位置
  3. 删除临时文件夹

使用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"); } 

然后,您可以将MemoryStream写入文件 。

 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(); } 

使用文件(或任何)流:

 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的引用

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

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

 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()); } } } } } }