Чтение файлов из архива, который содержит другой архивC#

Место общения программистов C#
Ответить
Anonymous
 Чтение файлов из архива, который содержит другой архив

Сообщение Anonymous »

Я использую SharpCompress и пытаюсь прочитать файлы, заархивированные в архиве 7z.
Теперь я застрял в момент, когда мой архив 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
Для ясности: я обрабатываю C:\temp\CaCCdm30_2.7z, который содержит другой CaCCdm30.7z
Я был Я могу решить эту проблему для 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»