Перечислять содержимое конкретной папки DotNetZip, без дочерних папок
Использование Ionic.Zip
Я хочу отобразить файлы или папки в определенной папке. Я использую метод SelectEntries, но он, к сожалению, отфильтровывает папки. Не то, что я ожидал, используя "*".
ICollection<ZipEntry> selectEntries = _zipFile.SelectEntries("*",rootLocation)
Если я буду следовать альтернативному подходу:
IEnumerable<ZipEntry> selectEntries = _zipFile.Entries.Where(e => e.FileName.StartsWith(rootLocation))
Я сталкиваюсь с двумя проблемами:
- Я должен поменять '/' для '\' потенциально.
- Я получаю все подпапки.
Что не желательно.
Кто-нибудь знает, почему 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();