C# 推荐一个库/API来解压缩C中的文件#
看起来C#中没有内置的库/API来解压缩zip文件。我正在寻找一个免费的(更好的开源)库/API,它可以与.NET3.5+VSTS2008+C一起工作,解压一个zip文件并将所有文件解压到一个特定的文件夹中 有推荐的库/API或示例吗?GPL 或者限制性较小的Ms PL 为了完成这个答案,.net框架在这方面我没有那么成功 SharpZipLibC# 推荐一个库/API来解压缩C中的文件#,c#,.net,zip,C#,.net,Zip,看起来C#中没有内置的库/API来解压缩zip文件。我正在寻找一个免费的(更好的开源)库/API,它可以与.NET3.5+VSTS2008+C一起工作,解压一个zip文件并将所有文件解压到一个特定的文件夹中 有推荐的库/API或示例吗?GPL 或者限制性较小的Ms PL 为了完成这个答案,.net框架在这方面我没有那么成功 SharpZipLib 如果您想使用7-zip压缩,请查看Peter Bromberg的。注意:for c#没有xml注释(实际上,注释很少)。易于使用。这是一个解压示例
如果您想使用7-zip压缩,请查看Peter Bromberg的。注意:for c#没有xml注释(实际上,注释很少)。易于使用。这是一个解压示例
using (var zip = Ionic.Zip.ZipFile.Read("archive.zip"))
{
zip.ExtractAll("unpack-directory");
}
如果您有更复杂的需求,比如您想要选择要提取的条目,或者如果有密码,或者如果您想要控制提取文件的路径名,等等,那么有很多选项。更多示例
DotNetZip是免费的、开源的。在过去,我使用过(MS-PL)、(GPL)和(公共域)。它们都工作得很好,而且都是开源的
在这种情况下,我会选择DotNetZip,下面是以下示例代码:
看看我的小图书馆:我会推荐我们的图书馆,但我有偏见。自己试用并检查这些功能和示例。如果您只想将文件内容解压缩到文件夹中,并且您知道您只能在Windows上运行,则可以使用Windows Shell对象。在本例中,我使用了Framework4.0中的
dynamic
,但是您可以使用Type.InvokeMember
获得相同的结果
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic compressedFolderContents = shellApplication.NameSpace(sourceFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(destinationPath);
destinationFolder.CopyHere(compressedFolderContents);
您可以使用来控制
CopyHere
方法的行为。如果您不想使用外部组件,下面是我昨晚使用.NET的ZipPackage类开发的一些代码
private static void Unzip()
{
var zipFilePath = "c:\\myfile.zip";
var tempFolderPath = "c:\\unzipped";
using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
foreach (PackagePart part in pkg.GetParts())
{
var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
var targetDir = target.Remove(target.LastIndexOf('\\'));
if (!Directory.Exists(targetDir))
Directory.CreateDirectory(targetDir);
using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
{
CopyStream(source, File.OpenWrite(target));
}
}
}
}
private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[4096];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
注意事项:
- ZIP存档文件的根目录中必须有[Content\u Types].xml文件。这对我的需求来说不是问题,因为我将控制通过此代码提取的任何ZIP文件的压缩。有关[Content\u Types].xml文件的更多信息,请参阅:本文图13下面有一个示例文件
- 我没有测试CopyStream方法以确保其行为正确,因为我最初使用Stream.CopyTo()方法为.NET 4.0开发了此方法
#区域创建ZipFile
public void StartZip(字符串目录、字符串zipfile_路径)
{
Label1.Text=“请稍候,正在进行备份”;
#从根文件夹获取文件的区域
string[]filenames=Directory.GetFiles(Directory);
//zip文件内置的路径
ZipOutputStream p=新的zipoutpstream(File.Create(zipfile_path));
foreach(文件名中的字符串文件名)
{
FileStream fs=File.OpenRead(文件名);
字节[]缓冲区=新字节[fs.Length];
fs.Read(buffer,0,buffer.Length);
ZipEntry条目=新ZipEntry(文件名);
p、 PutNextEntry(条目);
p、 写入(缓冲区,0,缓冲区长度);
fs.Close();
}
#端区
string dirName=string.Empty;
#从根文件夹获取文件夹的区域
DirectoryInfo[]DI=newdirectoryinfo(directory.GetDirectories(“**”),SearchOption.AllDirectories);
foreach(DI中的DirectoryInfo D1)
{
//您需要压缩的目录
filenames=Directory.GetFiles(D1.FullName);
如果(D1.ToString()=“备份”)
{
filenames=null;
继续;
}
if(dirName==string.Empty)
{
如果(D1.ToString()=“updates”| |(D1.Parent).ToString()=“updates”| |(D1.Parent).Parent.ToString()=“updates”| |((D1.Parent.Parent).Parent.ToString()=“updates”|((D1.Parent.Parent.Parent.Parent).Parent).ToString()=“updates”|(((D1.Parent.Parent.Parent.Parent).Parent)).ToString()=“updates”)
{
dirName=D1.ToString();
filenames=null;
继续;
}
}
其他的
{
if(D1.ToString()==dirName);
}
foreach(文件名中的字符串文件名)
{
FileStream fs=File.OpenRead(文件名);
字节[]缓冲区=新字节[fs.Length];
fs.Read(buffer,0,buffer.Length);
ZipEntry条目=新ZipEntry(文件名);
p、 PutNextEntry(条目);
p、 写入(缓冲区,0,缓冲区长度);
fs.Close();
}
filenames=null;
}
p、 设定水平(5);
p、 完成();
p、 Close();
#端区
}
#端区
#区域解压缩ZIP文件
公共bool UnZipFile(字符串inputPathFzipfile,字符串文件名)
{
bool-ret=真;
Label1.Text=“请稍候,正在提取下载的文件”;
string zipDirectory=string.Empty;
尝试
{
#如果文件夹已存在,请删除它
if(Directory.Exists(Server.MapPath(“~/updates/”+FileName))//服务器数据字段
{
String[]files=Directory.GetFiles(Server.MapPath(“~/updates/”+FileName));//服务器数据字段
foreach(文件中的var文件)
文件。删除(文件);
Directory.Delete(Server.MapPath(“~/updates/”+FileName),true);//服务器数据字段
}
#嗯
private static void Unzip()
{
var zipFilePath = "c:\\myfile.zip";
var tempFolderPath = "c:\\unzipped";
using (Package pkg = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read))
{
foreach (PackagePart part in pkg.GetParts())
{
var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/')));
var targetDir = target.Remove(target.LastIndexOf('\\'));
if (!Directory.Exists(targetDir))
Directory.CreateDirectory(targetDir);
using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read))
{
CopyStream(source, File.OpenWrite(target));
}
}
}
}
private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[4096];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
#region CreateZipFile
public void StartZip(string directory, string zipfile_path)
{
Label1.Text = "Please wait, taking backup";
#region Taking files from root Folder
string[] filenames = Directory.GetFiles(directory);
// path which the zip file built in
ZipOutputStream p = new ZipOutputStream(File.Create(zipfile_path));
foreach (string filename in filenames)
{
FileStream fs = File.OpenRead(filename);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(filename);
p.PutNextEntry(entry);
p.Write(buffer, 0 , buffer.Length);
fs.Close();
}
#endregion
string dirName= string.Empty;
#region Taking folders from root folder
DirectoryInfo[] DI = new DirectoryInfo(directory).GetDirectories("*.*", SearchOption.AllDirectories);
foreach (DirectoryInfo D1 in DI)
{
// the directory you need to zip
filenames = Directory.GetFiles(D1.FullName);
if (D1.ToString() == "backup")
{
filenames = null;
continue;
}
if (dirName == string.Empty)
{
if (D1.ToString() == "updates" || (D1.Parent).ToString() == "updates" || (D1.Parent).Parent.ToString() == "updates" || ((D1.Parent).Parent).Parent.ToString() == "updates" || (((D1.Parent).Parent).Parent).ToString() == "updates" || ((((D1.Parent).Parent).Parent)).ToString() == "updates")
{
dirName = D1.ToString();
filenames = null;
continue;
}
}
else
{
if (D1.ToString() == dirName) ;
}
foreach (string filename in filenames)
{
FileStream fs = File.OpenRead(filename);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(filename);
p.PutNextEntry(entry);
p.Write(buffer, 0, buffer.Length);
fs.Close();
}
filenames = null;
}
p.SetLevel(5);
p.Finish();
p.Close();
#endregion
}
#endregion
#region EXTRACT THE ZIP FILE
public bool UnZipFile(string InputPathOfZipFile, string FileName)
{
bool ret = true;
Label1.Text = "Please wait, extracting downloaded file";
string zipDirectory = string.Empty;
try
{
#region If Folder already exist Delete it
if (Directory.Exists(Server.MapPath("~/updates/" + FileName))) // server data field
{
String[] files = Directory.GetFiles(Server.MapPath("~/updates/" + FileName));//server data field
foreach (var file in files)
File.Delete(file);
Directory.Delete(Server.MapPath("~/updates/" + FileName), true);//server data field
}
#endregion
if (File.Exists(InputPathOfZipFile))
{
string baseDirectory = Path.GetDirectoryName(InputPathOfZipFile);
using (ZipInputStream ZipStream = new
ZipInputStream(File.OpenRead(InputPathOfZipFile)))
{
ZipEntry theEntry;
while ((theEntry = ZipStream.GetNextEntry()) != null)
{
if (theEntry.IsFile)
{
if (theEntry.Name != "")
{
string directoryName = theEntry.Name.Substring(theEntry.Name.IndexOf(FileName)); // server data field
string[] DirectorySplit = directoryName.Split('\\');
for (int i = 0; i < DirectorySplit.Length - 1; i++)
{
if (zipDirectory != null || zipDirectory != "")
zipDirectory = zipDirectory + @"\" + DirectorySplit[i];
else
zipDirectory = zipDirectory + DirectorySplit[i];
}
string first = Server.MapPath("~/updates") + @"\" + zipDirectory;
if (!Directory.Exists(first))
Directory.CreateDirectory(first);
string strNewFile = @"" + baseDirectory + @"\" + directoryName;
if (File.Exists(strNewFile))
{
continue;
}
zipDirectory = string.Empty;
using (FileStream streamWriter = File.Create(strNewFile))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = ZipStream.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
}
else if (theEntry.IsDirectory)
{
string strNewDirectory = @"" + baseDirectory + @"\" +
theEntry.Name;
if (!Directory.Exists(strNewDirectory))
{
Directory.CreateDirectory(strNewDirectory);
}
}
}
ZipStream.Close();
}
}
}
catch (Exception ex)
{
ret = false;
}
return ret;
}
#endregion
SevenZipCompressor compressor = new SevenZipCompressor();
compressor.CompressionLevel = CompressionLevel.Ultra;
compressor.CompressionMethod = CompressionMethod.Lzma;
compressor.CompressionMode = CompressionMode.Create;
compressor.CompressFiles(...);