Перечислять содержимое конкретной папки DotNetZip, без дочерних папок

Использование Ionic.Zip

Я хочу отобразить файлы или папки в определенной папке. Я использую метод SelectEntries, но он, к сожалению, отфильтровывает папки. Не то, что я ожидал, используя "*".

ICollection<ZipEntry> selectEntries = _zipFile.SelectEntries("*",rootLocation)

Если я буду следовать альтернативному подходу:

IEnumerable<ZipEntry> selectEntries = _zipFile.Entries.Where(e => e.FileName.StartsWith(rootLocation))

Я сталкиваюсь с двумя проблемами:

  1. Я должен поменять '/' для '\' потенциально.
  2. Я получаю все подпапки.

Что не желательно.

Кто-нибудь знает, почему SelectEntries не возвращает папки, или я неправильно его использую?

1 ответ

Я нашел решение в моем конкретном случае. Я думаю, что что-то в том, как был создан Zip-файл, привело к тому, что у него появились папки, но на самом деле их не было, т. Е. Следующий код дал пустой список.

_zipFile.Entries.Where(e=>e.IsDirectory).AsList();  // always empty!

Я использовал следующий фрагмент, чтобы добиться того, что мне нужно. Регулярное выражение не настолько полно, как следовало бы, но работало для всех случаев, в которых я нуждался.

var conformedRootLocation = rootLocation.Replace('\\','/').TrimEnd('/') + "/";
var pattern = string.Format(@"({0})([a-z|A-Z|.|_|0-9|\s]+)/?", conformedRootLocation);
var regex = new Regex(pattern);
return _zipFile.EntryFileNames.Select(e => regex.Match(e))
        .Where(match => match.Success)
        .Select(match => match.Groups[2].Value)
        .Distinct()
        .Select(f => new DirectoryResource
        {
            Name = f, IsDirectory = !Path.HasExtension(f)
        })
        .ToList();
Другие вопросы по тегам