我正在下载一个压缩文件,并用以下代码解压它:
WebClient client = new WebClient();
MemoryStream download = new MemoryStream(client.DownloadData(targetUrl));
var data = new GZipStream(download, CompressionMode.Decompress, true);
从这里,我如何查看压缩存档中的文件并对它们进行排序?我知道这个归档文件中有一个文件是我根据其文件类型(.csv)需要的,因此我需要将其取出。如何通过c#做到这一点呢?
发布于 2012-02-14 15:27:18
GZipStream用于对一个stream...you进行压缩和解压缩,不支持对多个文件进行压缩和解压缩。实际上,您可以,但您应该开发一些方法来将这些文件合并到一个流中,并且还应该知道如何进行反向操作(从流中获取这些文件)。如果你只有一个文件,你可以这样做:
using (var outFile = File.Create(outputFileName))
{
using (GZipStream gzip = new GZipStream(download, CompressionMode.Decompress))
{
var buffer = new byte[4096];
var numRead = 0;
while ((numRead = gzip.Read(buffer, 0, buffer.Length)) != 0)
{
outFile.Write(buffer, 0, numRead);
}
}
}
Here是一篇描述如何使用GZipStream压缩/解压缩多个文件的文章,但正如您所看到的,作者开发了自己的"zip“格式来存储多个文件,并且使用GZipStream压缩单个流。
在这种情况下,如果没有进行压缩,很可能会收到标准的压缩文件,在这种情况下,可以使用名为SharpZipLib的库对内容进行解压缩。
下面是一个使用SharpZipLib的示例
using (var s = new ZipInputStream(download))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
if(fileName == myFileName)
{
using (FileStream streamWriter = File.Create(theEntry.Name))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
}
}
}
发布于 2012-02-14 15:51:22
您是否正在从某个地方提取ZIP文件,并尝试从归档文件中提取单个文件?
您可以使用ZipPackage类来执行此操作。
http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx
具体参见GetPart方法的示例代码:
http://msdn.microsoft.com/en-us/library/system.io.packaging.package.getpart.aspx
https://stackoverflow.com/questions/9279066
复制相似问题