Извлечение файлов из архива

289
28 февраля 2017, 14:30

Здравствуйте! Есть класс который извлекает файлы из архива с перезаписью:

public static class ZipArchiveExtension
{
    public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName)
    {
        foreach (ZipArchiveEntry file in archive.Entries)
        {
            string completeFileName = Path.Combine(destinationDirectoryName, file.FullName);
            if (file.Name == "")
            {
                Directory.CreateDirectory(Path.GetDirectoryName(completeFileName));
                continue;
            }
            file.ExtractToFile(completeFileName, true);
        }
    }
}

Вот я его вызываю:

ZipPath = textBox4.Text + textBox5.Text + ".zip";
ExtractPath = textBox4.Text;
ZipToOpen = new FileStream(ZipPath, FileMode.Open);
Archive = new ZipArchive(ZipToOpen, ZipArchiveMode.Update, true, Encoding.GetEncoding("cp866"));
ZipArchiveExtension.ExtractToDirectory(Archive, ExtractPath);

Мне нужно что-бы при вызове метода я ещё указывал строковый массив с именами файлов которые не надо перезаписывать. Допустим я добавлю во входящие параметры метода строковый массив и заведу строковый массив с именами файлов которые не надо перезаписывать.

public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, string[] Massive)
string[] Massive = {"file1.txt", "file2.txt"};

Что делать дальше? Сравнивать в цикле массив с file.Name в foreach с помощью if, выполняя код если имена не совпали?

Answer 1

Сравнивать в цикле массив с file.Name в foreach с помощью if, выполняя код если имена не совпали?

Это вариант. В качестве альтернативы можно вместо цикла использовать Linq:

foreach (ZipArchiveEntry file in archive.Entries)
{
    //пропущено тело цикла
    //ignoredFilenames - массив игнорируемых файлов
    bool overwrite = !ignoredFilenames.Contains(file.Name);
    file.ExtractToFile(completeFileName, overwrite);

Если массив более нигде не используется будет логично сделать из него Set:

var ignoredFilenamesSet = new HashSet<String>(Arrays.asList(ignoredFilenames));
//затем в цикле
bool overwrite = !ignoredFilenamesSet.Contains(file.Name);

можно также принимать ISet в качестве аргумента.

Если игнорируемые файл вообще не нужно извлекать, то можно пропускать итерацию для файла:

foreach (ZipArchiveEntry file in archive.Entries)
{
    if(ignoredFilenamesSet.Contains(file.Name) continue;
    //... если не игнорируется, извлекаем
READ ALSO
Удалить файлы, загруженные в WebBrowser

Удалить файлы, загруженные в WebBrowser

Есть 3 формыКаждая по очереди открывается, происходят определенные операции (скачивание изображений, затем их конвертация и вставка в поля...

242
Не работает SetResolution на Bitmap

Не работает SetResolution на Bitmap

Немного не понимаю, почему не работает данный код:

250
Запуск программ

Запуск программ

Здравствуйте! Возможно ли сделать так что-бы операционная система не требовала установкиNET Framework и других компонентов для запуска программы...

243
Не удаляются пробелы из строки

Не удаляются пробелы из строки

Добрый вечерПроизвожу парсинг whois получаю данные потом их упорядочиваю на выходе получается вот это

305