如何阅读zip文档内的文本文件的内容?C#访问zip文档中的文本文件
例如我有一个存档qwe.zip,并且它有一个文件asd.txt,那么我该如何读取该文件的内容?
有没有可能不提取整个档案?因为它需要快速完成,所以当用户点击列表中的一个项目时,显示存档的描述(插件系统需要另一个程序)。因此,提取整个存档并不是最好的解决方案...因为它可能很少MB,这将需要至少几秒甚至更多的时间来提取...而只需要读取单个文件。
如何阅读zip文档内的文本文件的内容?C#访问zip文档中的文本文件
例如我有一个存档qwe.zip,并且它有一个文件asd.txt,那么我该如何读取该文件的内容?
有没有可能不提取整个档案?因为它需要快速完成,所以当用户点击列表中的一个项目时,显示存档的描述(插件系统需要另一个程序)。因此,提取整个存档并不是最好的解决方案...因为它可能很少MB,这将需要至少几秒甚至更多的时间来提取...而只需要读取单个文件。
您可以使用库如SharpZipLib或DotNetZip来解压缩文件并获取其中包含的各个文件的内容。此操作可以在内存中执行,并且不需要将这些文件存储到临时文件夹中。
解压缩到一个临时文件夹取得文件并删除临时数据
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;
}
}
虽然在游戏中后期,问题已经回答了,在希望中,这仍然可能是其他人谁发现有用这个线程,我想添加另一个解决方案。
就在今天,当我想用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”),给出了一个编码示例。
嗯,谢谢你的额外信息! – NewProger
SharpZipLib或DotNetZip可能仍然需要读取/读取整个.zip文件来解压文件。实际上,还有一种方法可以让你从.zip文件中提取特殊文件,而不需要读取整个.zip文件,只需要读取小段。
你可以在内存中解压缩并从那里读取或在临时文件夹中对磁盘进行操作 –
查找SharpZipLib或DotNetZip(在codeplex上) –
Davide Piras,但是不是一种更简单的方法......?它可以很容易地完成,即使在PHP中......这太奇怪了,没有办法从c#中的zip压缩文件中读取文件...我不敢相信它... – NewProger