C# 使用SevenZip在zip文件中提取压缩文件
我可以方便地提取zip文件中的所有图像文件,但是现在如果zip文件中存在一些压缩文件,我想提取所有内容。但是,当我尝试在zip文件中提取压缩文件时,我得到了DirectoryNotFoundException,非常感谢您的帮助C# 使用SevenZip在zip文件中提取压缩文件,c#,zip,7zip,sevenzipsharp,C#,Zip,7zip,Sevenzipsharp,我可以方便地提取zip文件中的所有图像文件,但是现在如果zip文件中存在一些压缩文件,我想提取所有内容。但是,当我尝试在zip文件中提取压缩文件时,我得到了DirectoryNotFoundException,非常感谢您的帮助 List<byte[]> ImagesAsBytes = new List<byte[]>(); private List<byte[]> FilesToBytesExtarctor(SevenZipExtrac
List<byte[]> ImagesAsBytes = new List<byte[]>();
private List<byte[]> FilesToBytesExtarctor(SevenZipExtractor Extractor, String[] FileNames, out String InfoTxt)
{
MemoryStream ms = new MemoryStream();
InfoTxt = "";
for (int i = 0; i < Extractor.FilesCount; i++)
{
if (IsDir(FileNames[i])) continue;
for (int x = 0; x < SupportedImageFormats.Count; x++)
{
if (FileNames[i].ToLower().EndsWith(SupportedImageFormats[x].ToString()))
{
ms = new MemoryStream();
Extractor.ExtractFile(FileNames[i], ms);
//Extractor.ExtractArchive(FileNames[i], ms);
ms.Position = 0;
ImagesAsBytes.Add(ms.ToArray());
ms.Close();
}
else if (FileNames[i].EndsWith(".txt") || FileNames[i].EndsWith(".TXT"))
{
ms = new MemoryStream();
Extractor.ExtractFile(FileNames[i], ms);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
InfoTxt = sr.ReadToEnd();
ms.Close();
//NextFile = true;
}
else if (FileNames[i].ToLower().EndsWith(SupportedArchiveFormats[x].ToString()))
{
SevenZipExtractor Extractor2;
string[] files = RawFileExtractor(Path.Combine(Extractor.FileName, FileNames[i]), out Extractor2);
ImagesAsBytes.AddRange(FilesToBytesExtarctor(Extractor2, files, out InfoTxt));
}
}
}
Extractor.Dispose();
return ImagesAsBytes;
}
private String[] RawFileExtractor(string file, out SevenZipExtractor Extractor)
{
Extractor = new SevenZipExtractor(file);
String[] FileNames = Extractor.ArchiveFileNames.ToArray();
Array.Sort(FileNames);
return FileNames;
}
我终于明白了。如果路径包含zip,则库无法读取路径,因此我将内部zip文件转换为流,然后使用另一个重载方法递归提取内部zip文件的内容。 我修改了归档路径,如下所示
else if (FileNames[i].ToLower().EndsWith(SupportedArchiveFormats[x].ToString()))
{
ms = new MemoryStream();
Extractor.ExtractFile(FileNames[i], ms);
ms.Position = 0;
SevenZipExtractor Extractor2;
string[] files = RawFileExtractorStream(ms, out Extractor2);
ImagesAsBytes.AddRange(FilesToBytesExtarctor(Extractor2, files, out InfoTxt)); //recurrsive: call function within its self
}
然后我为流创建了一个重载方法
private String[] RawFileExtractorStream(Stream file, out SevenZipExtractor Extractor)
{
Extractor = new SevenZipExtractor(file);
String[] FileNames = Extractor.ArchiveFileNames.ToArray();
Array.Sort(FileNames);
return FileNames;
}
哪一行出错?@EhsanUllah在函数RawFileExtractor中,行提取器=new sevenzipeExtractorfile;给出在zip中提取zip时的错误。但是,我最终领先了一步,将zip文件提取到一个流中,并使用另一个重载私有字符串[]RawFileExtractorStreamStream file,out SevenZipExtractor extractor您应该首先检查文件是否均匀exists@EhsanUllah谢谢,文件存在,但我认为当路径包含中间的拉链时,它无法读取它,例如c:\\mainfile.zip\\subfile.zip路径包含zip或zip包含另一个zip?