Есть ли способ узнать, есть ли в каталоге подкаталог? - PullRequest
4 голосов
/ 14 июля 2009

Я проснулся в C ++. Есть ли способ узнать, есть ли в каталоге подкаталог?

Кажется, CFileFind должен искать в файлах. Это занимает много времени, если единственный подкаталог находится в конце списка и там много файлов.

например: каталог A содержит 99995 файлов и один подкаталог в конце списка FindNextFile. Если бы я попытался 99995 раз, а затем сказал: да, он содержит подкаталог?

Ответы [ 4 ]

2 голосов
/ 14 июля 2009

Раймонд Чен из Microsoft написал пост, который, вероятно, относится к этому: Вычисление размера каталога - это больше, чем просто добавление размеров файла . По сути, он объясняет, что такая информация, как размер каталога, не может храниться в записи каталога, потому что разные пользователи могут иметь разные разрешения, что может сделать некоторые файлы невидимыми для них. Поэтому единственный способ получить размер, который должен видеть пользователь, - это рассчитать его по запросу пользователя.

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

Поскольку Win32 находится настолько близко к файловой системе в пользовательском режиме, я бы избегал любых решений более высокого уровня, таких как .NET, поскольку это могло бы только упростить интерфейс. Водитель может работать быстрее, но это выходит за рамки моих знаний.

1 голос
/ 14 июля 2009

Если вы используете .Net Framework, вы можете использовать Directory.GetDirectories и проверить, что размер массива равен 0. Не знаете, как это даст вам скорость.

Если у вас есть контроль над каталогами, вы можете применить соглашение об именах, чтобы каталоги с подкаталогами назывались одним способом, а каталоги без подкаталогов - другим.

1 голос
/ 14 июля 2009

Вы можете попробовать использовать библиотеку файловой системы boost.

Класс по имени directory_iterator [объявлен в boost / filesystem / operations.hpp] имеет много функций, которые можно использовать для перечисления файлов, определения, является ли файл подкаталогом (is_directory - я думаю, это то, что вы ищу) и т.д ..

Обратитесь по следующей ссылке для получения дополнительной информации. текст ссылки

Кажется, вы используете MFC [только что увидел, что вы используете CFileFind], раньше не видел. Извините, не было много информации. Возможно, вам придется использовать FindFirstFile / FindNextFile.

0 голосов
/ 14 июля 2009

Возможность сделать это очень быстро полностью зависит от платформы.

В Win32 вы используете FindFirstFile / FindNextFile или обертки поверх таких, как MFC CFileFind, и они перечисляют элементы в некотором порядке, который не может быть принудительно указан вначале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...