Теперь я застрял в момент, когда мой архив 7z содержит другой zip или 7z, который содержит файл, который я хочу прочитать . Есть ли способ прочитать содержимое файла, который заархивирован несколько раз, без извлечения архивов на диск?
Для целей тестирования у меня есть простой метод, который должен мне написать все записи из архива.
Код: Выделить всё
namespace TestArchiv
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
frmReference = this;
try
{
processArchive(@"C:\temp\temp.zip");
}
catch (Exception ex)
{
WriteToBox(ex.ToString());
}
}
public void processArchive(string archivePath)
{
using (var archive = SevenZipArchive.Open(archivePath))
{
foreach (var entry in archive.Entries)
{
if (entry.ToString().Contains("7z"))
{
using (SevenZipArchive inner2 = SevenZipArchive.Open(entry.OpenEntryStream()))
{
foreach (var entry2 in inner2.Entries)
{
WriteToBox(entry2.ToString());
}
}
}
WriteToBox(entry.ToString());
}
}
}
public void WriteToBox(string text)
{
//frmReference.TextBox1.Clear();
frmReference.TextBox1.AppendText("\r\n" + text);
}
}
}
Код: Выделить всё
System.NotSupportedException: Specified method is not supported.
at SharpCompress.IO.ReadOnlySubStream.get_Length()
at SharpCompress.IO.SourceStream.Seek(Int64 offset, SeekOrigin origin)
at SharpCompress.IO.SourceStream.set_Position(Int64 value)
at SharpCompress.IO.NonDisposingStream.set_Position(Int64 value)
at SharpCompress.Archives.SevenZip.SevenZipArchive.LoadFactory(Stream stream)
at SharpCompress.Archives.SevenZip.SevenZipArchive.LoadEntries(IEnumerable`1 volumes)
at SharpCompress.Archives.AbstractArchive`2..ctor(ArchiveType type, SourceStream sourceStream)
at SharpCompress.Archives.SevenZip.SevenZipArchive..ctor(SourceStream sourceStream)
at SharpCompress.Archives.SevenZip.SevenZipArchive.Open(Stream stream, ReaderOptions readerOptions)
at TestArchiv.MainWindow.processArchive(String archivePath) in C:\Users\martin.toman\source\repos\TestArchiv\TestArchiv\MainWindow.xaml.cs:line 56
at TestArchiv.MainWindow..ctor() in C:\Users\martin.toman\source\repos\TestArchiv\TestArchiv\MainWindow.xaml.cs:line 38
Я был Я могу решить эту проблему для Zip-файлов с помощью класса ZipFile из C#, но мне нужно, чтобы он работал и с другими типами архивов, поэтому я выбрал SharpCompress.
Это сработало для zip-файлов:
Код: Выделить всё
public void processArchive(ZipArchive archive)
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
string fileName = entry.ToString();
//WriteToBox(fileName);
if (fileName.ToLower().Contains(".zip"))
{
ZipArchive innerArchive = new ZipArchive(entry.Open());
processArchive(innerArchive);
}
else
.....
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... er-archive
Мобильная версия