使用c#压缩单个文件
本文关键字:文件 单个 压缩 使用 | 更新日期: 2023-09-27 18:15:34
我正在使用。net 4.5,如果我试图用"CreateFromDirectory"压缩整个目录,ZipFile类工作得很好。但是,我只想压缩目录中的一个文件。我试图指向一个特定的文件(文件夹'data.txt),但这不起作用。我考虑了ZipArchive类,因为它有一个"CreateEntryFromFile"方法,但似乎这只允许您在现有文件中创建一个条目。
有没有办法简单地压缩一个文件,而不创建一个空的zip文件(它有它的问题),然后使用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;"
,它会抛出一个错误,目录是无效的
从一个存档中使用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
的引用更新strong>
另外,还可以查看ZipFile和ZipArchive的新的dotnet API文档。这里有一些例子。还有一个关于引用System.IO.Compression.FileSystem
使用ZipFile
的警告。
要使用ZipFile类,必须引用System.IO.Compression.FileSystem . project.
最简单的方法是使用一个临时文件夹。
压缩:
- 创建临时文件夹
- 移动文件到文件夹 <
- 压缩文件夹/gh>
- 删除文件夹
:
- 解压存档
- 将文件从临时文件夹移动到您的位置
- 删除临时文件夹
在。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());
}
}
}
}
}
}