Как быстро узнать если у папки вложенные подпапки?

  • Автор темы Barmutik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Barmutik

Гость
#1
Важное слово "быстро"...

Почему встал вопрос ... если есть каталог и в нём 50.000 файлов и 1 папка, то процесс узнавания есть ли эта подпапка может занять ОЧЕНЬ много времени...

Как можно быстрее узнать?
 
Z

zubr

Гость
#2
А функция FindFirst с Attr=faDirectory не помогает?
 
B

Barmutik

Гость
#3
Неа ... не помогает .. если посмотреть как она реализована и почитать MSDN ... то легко заметить что эта функция практически плюёт с высокой колокольни на этот атрибут :angry: И возвращает она файлы в алфавитном порядке . и если файлов 50.000 скажем с цифровыми именами а подпапка с именем на буквы .. но ждать пока она найдёт подпапку будем очень долго :( ... а надо быстро ...
 
Z

zubr

Гость
#4
Вот только что попробовал, правда в C++Builder (на работе Delphi не стоит) - определяет только каталоги.
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSearchRec f;
AnsiString s;
if (!FindFirst("c:\\*.", faDirectory, f))
{
  s=f.Name;
  while (!FindNext(f))
  {
   s=f.Name;
  }

}
}
Получилось, когда параметр Patch сделал 'путь к каталогу\*.'
 
B

Barmutik

Гость
#5
Супер!!!! Сенкс!!! Магическая комбинация *. !!!!

Я пробовал *.* млм просто * ... и без шансов ... а вот именно в такой комбинации ... всё просто супер ... в 100 раз быстрее ...

Правда есть малость ограничение .. также находит файлы без расширения .. но это мелочь вообщем ...!!!

Спасибо реально большое!! :angry: :(
 
B

Barmutik

Гость
#7
Только вот нашлась побочная штука этого метода :)

Если каталог имеет в своём имени точку то данный вариант не работает ;) Оне не находит такие каталоги ;)

Может ещё какие варианты есть ?
 
Z

zubr

Гость
#9
Не знаю... Похоже остается только на низком уровне решать данную проблему - делать что то типа драйвера, по крайней мере получить доступ к файловой таблице.
 
B

Barmutik

Гость
#10
:) Вот и я не знаю ... пробовал FindFirstEx.. тоже не помогает ... так это вроде и есть обращение сразу к дисковой системе...
 
Z

zubr

Гость
#11
FindFirstFileEx я тоже пробовал, похоже Fat32 не поддерживает фильтр FindExSearchLimitToDirectories
FindExSearchLimitToDirectories This is an advisory flag. If the file system supports directory filtering, the function searches for a "file" that matches the specified filename and that is a directory. If the file system does not support directory filtering, this flag is silently ignored.The lpSearchFilter parameter must be NULL when this search operation is used.If you want directory filtering, use this flag on all file systems, but be sure to examine the file attribute data stored into *lpFindFileData to determine whether the function has indeed returned a handle to a directory.
 
Статус
Закрыто для дальнейших ответов.