2009-07-14 2 views
3

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

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

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

ответ

0

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

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

+0

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

+0

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

+1

OMG, очень плохой дизайн ... – user25749

1

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

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

1

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

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

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

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

+0

Многие благодарят все равно! более эффективная файловая система. Я использовал его, когда я работал в Linux – user25749

+3

Я полагаю, что в качестве примитивов boost также используется FindFirstFile/FindNextFile на Win32. Если они не смогут найти, как они работают, и проверить, лучше ли это решение. – sharptooth

2

Raymond Chen из Microsoft написал сообщение, которое, вероятно, применимо здесь: Computing the size of a directory is more than just adding file sizes. По сути, он объясняет, что информация, подобная размеру каталога, не может быть сохранена в записи dir, поскольку разные пользователи могут иметь разные разрешения, возможно, делая некоторые из файлов невидимыми для них. Поэтому единственный способ получить размер, который должен видеть пользователь, - рассчитать его по запросу пользователя.

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

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

Смежные вопросы