Как извлечь подкаталог с помощью C# DotNetZip?
У меня есть MyFile.zip, у которого есть основной каталог "MyMainFolder", и внутри него несколько подкаталогов, одно из которых я хочу извлечь (MySubFolder)... со всеми его подкаталогами и содержимым.
Я пытаюсь понять, как "войти" в MyMainFolder, чтобы я мог извлечь "MySubFolder".
У меня есть некоторый код, который будет извлекать папку, пока эта папка, которую я ищу, существует в качестве главной папки в zip-архиве... и я могу определить, называется ли главная папка "MyMainFolder", поэтому она знает, что заглядывать внутрь и извлечь оттуда, а не искать в главном почтовом корне для MySubFolder).
using (ZipFile zip1 = ZipFile.Read(fileName))
{
zipFile = ZipFile.Read(@""+fileName);
var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));
if (result == false)
{
MessageBox.Show("MyMainFolder detected....Extracting from MyMainFolder...");
// something here that will extract JUST MySubFolder and contents
} else {
foreach (var e in selection)
{
var selection = (from e in zip1.Entries where (e.FileName).Contains("NySubfolder") select e)
e.Extract(outputDirectory);
}
}
}
До сих пор я пытался поместить отдельное использование внутри каждой части if-else, и я попытался создать отдельное selectionX, в котором я пытался принудительно заставить имя корневой папки (которое всегда будет "MyMainFolder" для этого эксперимента) быть частью того, что он просматривал, думая, что я мог бы затем извлечь MySubFolder, но я также не мог заставить это работать. Я попытался включить несколько других методов, которые я нашел в stackflow и других случаях, таких как использование частей "как извлечь файлы, но игнорирование пути в zipfile" и других подобных сообщений, чтобы попытаться найти способ "пропустить" этот основной корень папка при распаковке. (чтобы он получал ТОЛЬКО "MySubFolder" (и его содержимое) и извлекал данные в outputDirectory (не MyMainFolder\MySubFolder...)
Любая помощь приветствуется. Спасибо!!
1 ответ
Перечисление всего содержимого до тех пор, пока я не наткнулся на то, что я искал, сработало, но просто в качестве эксперимента я хотел посмотреть, можно ли это сделать по-другому.
Так как я не смог проверить имена подпапок внутри корневой папки, я решил, что могу просто сопоставить то, что искал, анализируя его, извлекая только то, что хотел, а затем просто изменить путь вывода.
using (ZipFile zip1 = ZipFile.Read(fileName))
{
zipFile = ZipFile.Read(@""+fileName);
var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));
if (result == false)
{
// something here that will extract JUST MySubFolder and content
string TestX = Path.GetDirectoryName(e.FileName) ;
string MyNewPath = outputDirectory+@"\"+TestX ;
e.Extract(MyNewPath);
} else {
foreach (var e in selection)
{
var selection = (from e in zip1.Entries where (e.FileName).Contains("MySubfolder")
.select e)
e.Extract(outputDirectory);
}
}
Как-то так.. Не очень полезно, но интересно и помогло мне немного научиться. (если ничего, пример того, как НЕ делать вещи.. хе-хе) Спасибо