如何阅读zip存档中文本文件的内容?
例如我有一个存档qwe.zip,并且它有一个文件asd.txt,那么如何读取该文件的内容呢?
是否可以不提取整个档案?因为当用户单击列表中的项目时,需要快速完成,以显示存档的描述(它是另一个程序的插件系统所需)。因此,提取整个存档并不是最好的解决方案...因为它可能只有少量Mb,这将需要至少几秒甚至更长时间来提取...而只需要读取该单个文件。
答案 0 :(得分:3)
您可以使用SharpZipLib或DotNetZip等库来解压缩文件并获取其中包含的各个文件的内容。此操作可以在内存中执行,您无需将文件存储到临时文件夹中。
答案 1 :(得分:2)
解压缩到临时文件夹获取文件并删除临时数据
public static void Decompress(string outputDirectory, string zipFile)
{
try
{
if (!File.Exists(zipFile))
throw new FileNotFoundException("Zip file not found.", zipFile);
Package zipPackage = ZipPackage.Open(zipFile, FileMode.Open, FileAccess.Read);
foreach (PackagePart part in zipPackage.GetParts())
{
string targetFile = outputDirectory + "\\" + part.Uri.ToString().TrimStart('/');
using (Stream streamSource = part.GetStream(FileMode.Open, FileAccess.Read))
{
using (Stream streamDestination = File.OpenWrite(targetFile))
{
Byte[] arrBuffer = new byte[10000];
int iRead = streamSource.Read(arrBuffer, 0, arrBuffer.Length);
while (iRead > 0)
{
streamDestination.Write(arrBuffer, 0, iRead);
iRead = streamSource.Read(arrBuffer, 0, arrBuffer.Length);
}
}
}
}
}
catch (Exception)
{
throw;
}
}
答案 2 :(得分:1)
虽然在游戏后期且问题已经得到解答,但希望这对于找到此主题的其他人来说仍然有用,我想添加另一个解决方案。
就在今天,当我想用C#检查ZIP文件的内容时遇到了类似的问题。除了NewProger,我不能使用第三方库,需要保持开箱即用的.NET类。
您可以使用System.IO.Packaging
命名空间并使用ZipPackage
类。如果它尚未包含在程序集中,则需要添加对WindowsBase.dll
的引用。
然而,似乎这个类并不总是适用于每个Zip文件。调用GetParts()
可能会返回一个空列表,尽管在QuickWatch窗口中您可以找到包含正确内容的名为_zipArchive
的属性。
如果是这种情况,您可以使用Reflection
获取其内容。
在 geissingert.com 上,您可以找到一篇博客文章(“Getting a list of files from a ZipPackage”),为此提供编码示例。
答案 3 :(得分:0)
SharpZipLib或DotNetZip可能仍需要获取/读取整个.zip文件以解压缩文件。实际上,还有一种方法可以让你只是从.zip文件中提取特殊文件而不读取整个.zip文件而只是读取小段。
答案 4 :(得分:0)
我需要深入了解Excel文件,就像这样:
using (var zip = ZipFile.Open("ExcelWorkbookWithMacros.xlsm", ZipArchiveMode.Update))
{
var entry = zip.GetEntry("xl/_rels/workbook.xml.rels");
if (entry != null)
{
var tempFile = Path.GetTempFileName();
entry.ExtractToFile(tempFile, true);
var content = File.ReadAllText(tempFile);
[...]
}
}