Использование SharpCompress для определения томов, связанных с данным архивом RAR
TL;DR
пример кода, указанный на домашней странице сайта, не компилируется. Как составить список всех томов в файле RAR, состоящем из нескольких частей?
Определение проблемы
У меня есть папка Windows 10 с множеством RAR-файлов из нескольких частей. "Корневой" rar и его части должны быть отделены, а затем перемещены в свои собственные папки. Я могу сделать это вручную, создав папку и проверив имена файлов, чтобы корневой rar, а затем "part01.rar", "part02.rar" и т. Д. Находились в одном каталоге.
Когда есть десятки файлов, состоящих из нескольких частей, ручной процесс утомителен, поэтому я пишу приложение на C#. До сих пор я узнал, что соглашения об именах с этими RAR-файлами, состоящими из нескольких частей, не соответствуют друг другу, и это оставило меня в неловком упражнении по изучению их имен файлов и выводу, где они принадлежат, путем манипулирования строками. Распущено.
Поэтому я импортирую SharpCompress с целью научного и точного получения имен файлов. На странице документации есть пример, который, кажется, делает именно то, что я хочу. Я обернул метод вокруг него и теперь представляю его вам как "то, что я пробовал".
private static void GetFileNames(FileInfo rarFileInfo)
{
var archive = ArchiveFactory.Open(rarFileInfo.FullName);
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.FilePath);
}
}
}
... и обратите внимание на красный текст, созданный VS...
Он не компилируется, потому что FilePath не может быть разрешен! У меня неправильные рамки? Я использую.NET 4.5 под VS2013. Теоретически здесь уже должно быть много вопросов, потому что образец документации на домашнем сайте не компилируется, но нет (я проверял).
Вопрос: Как использовать SharpCompress для идентификации всех томов, связанных с данным RAR, чтобы их имена могли быть доступны разработчику.
ПРИМЕЧАНИЕ. Я также мог бы использовать WinRar API для распаковки файлов в свои собственные каталоги, но это не то, что хочет клиент. Я на самом деле распакую их позже, цель состоит в том, чтобы собрать все связанные тома в свои собственные папки.
1 ответ
Исправление примера
Обратите внимание, что это красная сельдь. Ваша проблема в том, что вы не соответствуете документации и библиотеке
Последняя версия CodePlex в SharpCompress - 0.10.3, для которой (когда я ее скачиваю) ваш код и пример кода работают нормально.
Однако в NuGet и GitHub существуют версии 0.12.4.
В этой версии кажется, что элемент IArchiveElement из FullPath был удален.
Документация для этой версии доступна на github, и пример изменяется таким образом:
var archive = ArchiveFactory.Open(@"C:\Code\sharpcompress\TestArchives\sharpcompress.zip");
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
entry.WriteToDirectory(@"C:\temp", ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
}
}
Может показаться, что archive.Entries теперь является словарем (или аналогичным) IArchiveEntry, и путь используется как ключ для словаря, а не как элемент самого IArchiveEntry.
Итак, короткий ответ: вы должны заменить Entry.FullPath
с Entry.Key
в вашем коде выше. Однако мне не ясно, как это помогает определить, какие архивы необходимо объединить.
Как на самом деле решить вашу проблему
Что вы на самом деле хотите, так это найти, какие тома составляют многочастный RAR. Который включает в себя использование специфических особенностей предложений "Rar", а не базовых интерфейсов, использованных выше. Это должно работать:
static void PrintVoulmes(string ArchivePath)
{
RarArchive openedArchive = RarArchive.Open(ArchivePath);
foreach (RarVolume vol in openedArchive.Volumes)
{
Console.WriteLine(vol.VolumeFile.FullName);
}
}
Обратите внимание, что VolumeFile имеет стандартный тип.net FileInfo. Также обратите внимание: это было протестировано с версией 0.10.3, потому что я не могу получить версию 0.12.4 для VS2012, по-видимому. Существует вероятность того, что здесь также будут изменены названия объектов недвижимости.