C# — C# выбор всех каталогов и подкаталогов с содержимым


c# — Как получить список каталогов и подкаталогов С# WPF

Как бы вы получили список всех подкаталогов и их подкаталогов (до тех пор, пока их не осталось) из корневого каталога.

В моем текущем коде используется FolderBrowserDialog (WPF не имеет одного, поэтому я должен его взять из winforms), а оттуда — попытки поперечных каталогов. Пока я могу сделать это только поперечно на 1 уровень, как в

Если музыкальный каталог настроен как

и пользователь выбирает rock , он будет захватывать только файлы с аэросмита, что-то и металлы, а не подкаталог metallica, ездить на молнии.

В основном, что я пытался сделать, сначала добавить все свободные файлы из корневого каталога, а затем получить список каталогов внутри корневого каталога и добавить эти файлы.

Я думаю, что я мог бы понять это, если бы знал, как сканировать все подкаталоги, начиная с корневого каталога, но я не совсем понимаю, как бы это достичь.

У кого-нибудь есть подсказки, советы или примеры кода, которые позволяют вам указать корневой каталог, а затем сканировать каждую директорию (сохраняя строковый массив), пока не будет найдено больше подкаталогов, поэтому я могу захватить файлы из каждого каталога?

    2 1
  • 4 июн 2020 2020-06-04 02:24:56
  • randy newfield

1 ответ

Чтобы получить все подкаталоги, вам необходимо передать SearchOption в качестве третьего аргумента, который также вернет все подкаталоги.


Список всех файлов и каталогов в каталоге + подкаталоги

Я хочу перечислить каждый файл и каталог, содержащиеся в каталоге и подкаталогах этого каталога. Если я выбрал C:\в качестве каталога, программа получит каждое имя каждого файла и папки на жестком диске, к которому у него был доступ.

Список может выглядеть как

где *.* — шаблон для соответствия файлам

Если каталог также необходим, вы можете сделать следующее:

Directory.GetFileSystemEntries существует в .NET 4.0+ и возвращает оба файла и каталоги. Назовите его так:

Обратите внимание, что он не справится с попытками перечислить содержимое подкаталогов, к которым у вас нет доступа (UnauthorizedAccessException), но этого может быть достаточно для ваших нужд.

Используйте GetDirectories и GetFiles методы для получения папок и файлов.

Используйте SearchOption AllDirectories , чтобы получить папки и файлы в подпапках.

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

Совет. Вы можете использовать классы FileInfo и DirectoryInfo , если вам нужно проверить какой-либо конкретный атрибут.

Если у вас нет доступа к вложенной папке внутри дерева каталогов, Directory.GetFiles останавливается и выдает исключение, в результате чего получается нулевое значение в принимающей строке [].

Он управляет исключением внутри цикла и продолжает работать до тех пор, пока не будет пройдена целая папка.

Полезный Велосипед – Выбрать каталог на WPF без WinForms


Думаю, что многие не любят «велосипеды» и «костыли», хотя используют частенько. Но иногда без «велосипедов» никуда. Вот один из подобных случаев, когда для выбора каталога, почему-то нужно использовать Windows.Forms, ввиду отсутствия стандартного контрола в WPF.

Но начну сначала. Понадобилось мне использовать диалоговое окно «Выбрать каталог» в своем приложении, которое было написано на WPF. Возможно для многих это давно не новость, но я с удивлением узнал, что стандартного диалога для выбора каталога на WPF — просто нет.

На stackoverflow.com на подобный вопрос посоветовали использовать OpenFileDialog и FolderBrowserDialog из System.Windows.Forms, Microsoft.Win32.OpenFileDialog.

Под катом, «велосипед» позволяющий выбрать каталог на WPF без использования WinForms, пример в картинках, а также ответ чем данный «велосипед» полезен.

Мне не хотелось смешивать Windows.Forms и WPF. Возникает разное отображение контролов. В самом приложении на WPF один (Ваш красивый оригинальный) стиль, а в Диалоговом окне – другой (стандартный и унылый). Об этом написано тут. Скажу честно, сам проверять не стал, поверил статье и своей логике.

Если Вы, как и я используете WPF то, скорее всего, хотите сделать приложение с хорошим дизайном. А иное оформление диалогового окна, при выборе папки может нарушить единство стиля.

Поэтому написал свой «велосипед» для выбора каталога на WPF. Скачать можно здесь. Не скажу что способ идеальный, если он существует, был бы рад услышать в комментариях. Главное в моем способе: работает и позволяет применить единый стиль для всего приложения.

Программа в примере (без стилей, ничего лишнего), выбирает файлы формата mp3 из выбранного каталога и выводит их в ListBox.

Выбираем каталог – Указываем локальный диск, затем требуемый каталог:

После выбора каталога, тут я выделил красным выбранный каталог:

Запускаем обработку – Показать mp3 файлы:

Цукерберг рекомендует:  Руководство по HTML5 Web Audio API делаем виртуальный синтезатор

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Представление любого каталога в виде древовидной структуры с использованием элемента управления «TreeView»: Справочник по C#

В .NET Framework присутствует класс «TreeView», который представляет визуальный элемент управления для отображения иерархических данных в древовидной структуре, содержащей элементы, которые можно развернуть и свернуть. Рассмотрим представление любого каталога в виде древовидной структуры с использованием элемента управления «TreeView».
Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта элемент управления «TreeView». Сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенный ниже листинг.

Добавьте приведенные ниже два метода сканирования и вывода указанной директории в элемент управления «TreeView», в листинг главной формы.


Перейдите в свойства элемента управления «TreeView» и выставьте значение «Fill», у свойства «Dock». Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется диалоговое окно выбора директории для сканирования и вывода структуры выбранного каталога в виде древовидной структуры.

Классы:Directory и DirectoryInfo

Дата изменения: 10.10.2020

Функционал классов Directory и DirectoryInfo похож на функционал классов работы с файлами: File и Fileinfo. Это обосновано тем, что директории – это каталоги в терминах файловых систем.

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

Для работы с директориями в платформе .NET предусмотрены два класса: Directory и DirectoryInfo. Из-за родственности файлов и директорий механизм наследования этих классов, как и способы использования очень похожи на взаимодействие с классами File и FileInfo.

Класс Directory

Объявлен и определен в корне System.IO. Содержит в себе группу статических членов для создания, удаления, перемещения и переименования каталогов и подкаталогов.

Запечатанный и статический тип: не может иметь наследников, объект класса создать нельзя.

Методы для создания директории:

CreateDirectory(String) и CreateDirectory(String, DirectorySecurity): первый создает каталог по указанному в качестве параметра пути, второй (перегруженный) – делает то же, но с параметрами безопасности Windows.

Методы удаления:

Delete(String) и Delete(String, Boolean): первый удаляет пустой каталог, путь к которому передан в качестве параметра, второй (перегруженный) позволяет удалить катало со всеми подкаталогами.

Метод перемещения:

Move(String, String) – перемещает содержимое каталога, заданного в первом параметре в каталог, заданный вторым параметром.


Основные методы информации о файлах:

GetLogicalDrives() : выдает имена логических дисков в системе.

GetFiles(String), выдают имена содержащихся в каталоге файлах.

GetCreationTime(String), GetLastWriteTime(String), GetLastAccessTime(String) – выдают информацию о датах и времени создания, последней записи в каталог или доступа к нему.

Использовать функционал класса Directory рекомендуется для одиночных операций с каталогом. Поскольку каждое использование сопряжено либо с проверкой введенных пользователем путями, либо с файлами внутри каталога рекомендуется включать его в блок try\catch. Если путь будет задан неправильно, это вызовет исключение.

Класс DirectoryInfo

Ссылочный тип, наследуется от System.IO.FileSystemInfo, поэтому имеет массу перегруженных методов родительского класса, а также десяток полезных свойств при работе с каталогами:

  • с помощью Attributes, например, можно считать или задать атрибуты каталога;
  • Extension позволит узнать о расширениях файлов, которые находятся внутри каталога;
  • Exist проверяет существование каталога;
  • Name, Parent, Root – возвращают имя каталога, путь к родительскому или корневому каталогу.

Поскольку DirectoryInfo – ссылочный тип(класс), прежде чем воспользоваться его членами нужно создать его объект с помощью конструктора. В качестве параметра конструктора необходимо передать строку с путем и именем каталога. Каталог будет назначен текущим рабочим каталогом для созданного экземпляра DirectInfo.

Конструктор не создает каталогов, а лишь привязывает к ним. Если каталог, переданный вместе с путём к нему параметром в конструктор, отсутствует, его нужно создать с помощью метода Create() перед его использованием, иначе использование вызовет исключение.

Еще лучше, это воспользоваться свойством Exist перед использованием обьекта внутри блока try/catch:

Назначение класса DirectoryInfo, то же что и у Derectory. Однако, первый применяется для операций где один и тот же объект (каталог) используется множество раз. Чтобы не прописывать его столько раз, сколько он использозован, на каждом этапе инициируя проверку удобнее использовать объектную ссылку.

Для понимания взаимодействия между классами и сферы их применения служит следующий пример. В нем содержимое одной папки копируется в другую.


C# — C# выбор всех каталогов и подкаталогов с содержимым

Параметры получил. Спасибо neomichi. Спасибо diomercury.

Сейчас пытаюсь собрать Полные Имена всех подкаталогов директории, подкаталоги подкаталогов директории и так далее. Полистал справочник нашел способ получить Полные Имена подкаталогов только текущей директории:

Вижу только один способ получить все имена — заходить в каждый подкаталог, получать его подкаталоги и т.д. Есть ли способ проще?

Так же буду благодарен за любой другой совет по теме.

13.05.2009, 20:48 #6

Посидел-пописал
Вроде даже работает, но не могу нарисовать полосочки как в Tree от M$. Без них от программы толку мало.

Буду рад любому совету кроме «выпей йаду».

________________________
Вот я и закончил писать. Выкладываю результат, вдруг кому пригодится.

____________________
Подчистил, убрал пару косячков, выделил цветом имена файлов, добавил комментарии. Однако, если снять защиту, программа аварийно завершится с ошибкой «Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога — меньше 248 знаков.» + программа по неизвестной причине игнорирует некоторые папки. о_О

А так все нормально. ^_^ Скачать. (ссылка сдохла )

Подкаталог

Корневой каталог и подкаталоги имеют различия: корневой создается при форматировании диска, он находится на фиксированном месте, его нельзя удалить командой RDIR (в ОС MS DOS). Подкаталоги хранятся в любом месте на диске, как обычные файлы.


Форматы полей и содержимое каталогов нижнего уровня такие же, как у корневого каталога. Каталог нижнего уровня всегда связан с каталогом-родителем, который может быть как корневым каталогом, так и каталогом более низкого уровня. В каталоге-родителе всегда есть запись для каталога потомка, которая отличается от записи обычного файла тем, что в ней установлен бит №4 в байте атрибутов в единицу и поле размера файла имеет нулевую длину.

При создании каталогов нижнего уровня в нем выделяются две записи:

— первая запись означает сам каталог, она в поле имени имеет символ «.», номер начального кластера в этой записи соответствует местоположению самого подкаталога;

— вторая запись – ссылка на каталог-родитель. В поле имени «..» номер начального кластера указывает местоположение каталога-родителя.

Если начальный кластер каталога-родителя равен нулю, то это означает, что родителем является корневой каталог.

Обычно пользователям бывает необходимо логически группировать свои файлы, поэтому требуется некий гибкий способ, позволяющий объединять файлы в группы. Для удобства работы ОС предоставляет пользователю понятную абстрактную модель файловой системы. Современные файловые системы организованы в иерархические структуры, верхним уровнем которой и является корневой каталог диска. При таком подходе каждый пользователь может сам создать себе столько каталогов и подкаталогов, сколько ему нужно, группируя свои файлы естественным образом. Возможность создавать произвольное количество подкаталогов является мощным структурирующим инструментом, позволяющим пользователям организовать свою работу.

В иерархической структуре данных логический адрес объекта задается маршрутом (путем доступа), ведущим от вершины структуры к объекту (рисунок 3.4). При записи пути доступа к файлу, проходящего через систему вложенных каталогов, все промежуточные каталоги разделяются между собой определенным символом. Отдельные компоненты в ОС UNIX разделяются косой чертой /, а в MS DOS и Windows – обратной косой чертой «\» (слэш – обратная косая черта), например: D:\Статьи\St1.doc (рисунок 3.3).

Рисунок 3.3 – Иерархическая структура корневого каталога логического диска D

Указатель перечня имен каталогов на пути к файлу называется абсолютным именем пути. Абсолютные имена путей всегда начинаются от корневого каталога и являются уникальными. Кроме того применяется и относительное имя пути. Оно используется вместе с понятием текущего каталога. Пользователь может назначить один из каталогов текущим рабочим каталогом. В этом случае все имена путей, не начинающиеся с символа разделителя, считаются относительными и отсчитываются относительно текущего каталога. Например, если текущим каталогом является каталог Мои рисунки, тогда к файлу с абсолютным путем D:\Мои рисунки\Ris_2.bmp можно обратиться просто как к Ris_2.bmp.

Когда пользователь обращается к файлу, указывая операционной системе его имя, то ОС, прежде чем выполнить операцию с файлом, обращается к файлу-каталогу, находит в нем запись, соответствующую указанному имени файла, определяет местоположение кластеров, занимаемых файлом, и только после этого выполняет заданные пользователем действия.

Файл – это именованная последовательность байтов произвольной длины. Файлы идентифицируются именами. Пользователи дают файлам символьные имена, при этом учитываются ограничения ОС как на используемые символы, так и на длину имени. В OC MS DOS эти границы были весьма узкими: длина имен ограничивается известной схемой 8.3 (8 символов – собственно имя, 3 символа – расширение имени). Однако пользователю гораздо удобнее работать с длинными именами, поскольку они позволяют дать файлу действительно мнемоническое название, по которому даже через достаточно большой промежуток времени можно будет вспомнить, что содержит этот файл. Поэтому современные файловые системы, как правило, поддерживают длинные символьные имена файлов.

При переходе к длинным именам возникает проблема совместимости с ранее созданными приложениями, использующими короткие имена. Чтобы приложения могли обращаться к файлам в соответствии с принятыми ранее соглашениями, файловая система должна уметь предоставлять эквивалентные короткие имена (псевдонимы) файлам, имеющим длинные имена. Таким образом, одной из важных задач становится проблема генерации соответствующих коротких имен.

Длинные имена поддерживаются не только новыми файловыми системами, но и новыми версиями хорошо известных файловых систем. Например, в ОС Windows 95 используется 16 битовая файловая система, представляющая собой существенно измененный вариант 12 битовой FAT. Среди многих других усовершенствований одним из главных достоинств явилась поддержка длинных имен. Кроме проблемы генерации эквивалентных коротких имен, при реализации нового варианта FAT важной задачей была задача хранения длинных имен при условии, что принципиально метод хранения и структура данных на диске не должны были измениться. ОС Windows 98 использует 32-битовую FAT.

Соглашение 8.3 для записи в каталоге отводит один 32 байтный элемент, Windows – до 21 элемента. Длинное имя – до 256 символов, полное имя – до 260 символов, начиная от корня. Прописные и строчные буквы не различаются, но ОС регистрируются.

В момент записи файла на диск система Windows, прежде всего, проверяет имя файла. Если она «видит», что в этом имени не более восьми символов и при этом в нем нет пробелов, то система «понимает», что перед ней обычное короткое имя файла и отво­дит для него один 32-байтный элемент.


Если система обнаруживает, что в имени файла более восьми символов или в нем использованы пробелы, то она воспринимает это имя как длинное и отводит для него два и более элемента. В первом элементе в поле имени записываются первые восемь символов имени, в поле расширения имени записывается первые три символа после последней точки, и затем дата создания файла и прочее. Остальная часть информации записывается в дополнительных элементах, которых может быть до 20. Таким образом, длинное имя файла может занимать от 2 до 21 элементов.

Когда подобный файл попадает на компьютер, работающий в системе MS DOS или в какой-либо другой системе, не поддерживающей длинные имена файлов, файл распознается по первому элементу, то есть по первым восьми символам имени. Все прочие символы имени файла игнорируются, но работать с таким файлом можно.

Не нашли то, что искали? Воспользуйтесь поиском:

Как вызвать диалог выбора папки?

OpenFileDialog открывает только файлы а как выбрать папку?

Для WPF ничего не могу найти.

1 ответ 1

Используйте FolderBrowserDialog класс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# wpf или задайте свой вопрос.

Связанные

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.11.13.35428


C#: операции с файлами\дисками\директориями

Примеры кусков кода для работы в C# с директориями\папками\дисками

Работа с файлами:

Работа с директориями:

Работа с дисками:

Работа с файловыми потоками:

Работа с бинарными данными:

Чтение\запись в файлы:

Архивирование:

Если Вы хотите обменяться ссылками со мной между сайтами — пишите в контактах

C# — C# выбор всех каталогов и подкаталогов с содержимым

цитата: QZ:
И пробовали
И получается
Что то ещё спросите?

Добавление от 01.11.2002 12:06:

цитата: Partisan:
можно, пользуясь функциями из System.IO.Directory (DirectoryInfo) самостоятельно запрограммировать некоторые диалоговые окна выбора справочника.



Я прекрасно знаю, что это можно сделать самому, и если буду делать, то скорее через SHGetDesktopFolder и ShBrowseForFolder API функции, чтобы вызывать родной диалог Windows. Просто прежде чем за это браться, хотелось бы убедиться нет стандартных решений.
27.05.2009, 18:49 #7
11. QZ , 01.11.2002 12:16
12. Zum , 01.11.2002 12:35
Спасибо огромное
13. vlad_sky , 01.11.2002 15:53
QZ
Спасибо, больше ничего не спрошу, этого достаточно Тем более код.

Добавление от 01.11.2002 16:01:

Zum
Просто прежде чем за это браться, хотелось бы убедиться нет стандартных решений.

Есть у меня некоторые сомнения относительности стандартности этого решения.
Систем.Десигн.длл, как я понимаю, создан специально для поддержки ИДЕ ВизуалСтудии. ВизуалСтудия реализована только для Вин32. Потому подозреваю, что реализовано это окошко как-раз через вызов Вин32 АПИ функции.
Стало быть никакого выигрыша (ни кроссплатформенности, ни уверенности в обязательном присутствии этого класса в след. версиях) относительно прямого вызова Вин32АПИ я не вижу.
К тому-же есть опасение, что использовать эту Систем.Дезигн.длл на машинах с НЕустановленной студией будет невозможно (проверить не могу).

Буду рад, если кто-нибудь меня опровергнет.

14. Dmitriy M. Reznitskiy , 01.11.2002 19:27
vlad_sky
в конечном итогде всё реализовано через win32 api.
А стандартный диалог выборп директории реализован в Shell api.
Думаю, что несильно ошибусь и в случае .net
15. Partisan , 01.11.2002 19:43
Систем.Десигн.длл, как я понимаю, создан специально для поддержки ИДЕ ВизуалСтудии
нет

К тому-же есть опасение, что использовать эту Систем.Дезигн.длл на машинах с НЕустановленной студией будет невозможно (проверить не могу).

опровергаю. Достаточно NET Framework. Вот у меня на компьютере сейчас этот пример работает, хотя VS нету.

Стало быть никакого выигрыша (ни кроссплатформенности, ни уверенности в обязательном присутствии этого класса в след. версиях) относительно прямого вызова Вин32АПИ я не вижу.

Сомнение, что он не будет в следующих версиях, беспочвенно. Переносимости Winforms пока вообще нет: MS сделала Rotor для FreeBSD без Windows.Forms (вместо них Tk). Альтернативный проект для Linux предусматривает реализацию Windows.Forms через GTK+, но насколько полной будет реализация, не интересовался. Хоть как бы работало. Это вообще мелкий вопрос, т.к. такой диалог можно легко (хоть и не так красиво) запрограммировать через функции System.IO , и в интернете есть несколько статей с примерами этого.

16. vlad_sky , 01.11.2002 22:26
Partisan

цитата: Систем.Десигн.длл, как я понимаю, создан специально для поддержки ИДЕ ВизуалСтудии
нет

цитата (МСДН (http://msdn.microsoft.com/library/default.asp?url=/l…wsformsdesign.asp)): The System.Windows.Forms.Design namespace contains classes that can be used to extend design-time support for Windows Forms.

Показателен также список классов присутствующих в этом неймспейсе.

опровергаю. Достаточно NET Framework. Вот у меня на компьютере сейчас этот пример работает, хотя VS нету.
Это хорошо, конечно. С другой стороны не факт, что в след. релизе эта служебная длл не потянет в свои депенденси добрую половину (утрированно) библиотек ИДЕ (или не преподнесёт прочих подобных сюрпризов).

Цукерберг рекомендует:  Node js - PHP VS Node.js
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих