Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Вниз

поиск папок   Найти похожие ветки 

 
QAZ   (2009-06-10 12:46) [0]

есть ли нормальный\быстрый способ поиска папок или проверки что в папке есть папка
кроме как искать все файлы и по атрибутам смотреть папка это или нет?
может интерфейсы оболочки или как нибуть


 
brother ©   (2009-06-10 12:48) [1]

что такое рекруссия знаешь?


 
Плохиш ©   (2009-06-10 14:28) [2]


> есть ли нормальный\быстрый способ поиска папок или проверки
> что в папке есть папка
> кроме как искать все файлы и по атрибутам смотреть папка
> это или нет?
>

Хм, что-то типа проверки девственности не заглядывая туда?


 
Ega23 ©   (2009-06-10 14:51) [3]

FindFirst, FindNext - чего быстрее-то?


 
Германн ©   (2009-06-10 14:52) [4]


> brother ©   (10.06.09 12:48) [1]
>
> что такое рекруссия знаешь?
>

Я тоже не знаю :(


 
QAZ   (2009-06-10 14:57) [5]

Удалено модератором
Примечание: Обсуждение модерирования


 
Германн ©   (2009-06-10 15:03) [6]


> в том то и вопрос что они не могут искать только папки

С точки зрения ОС папка и файл почти одно и тоже. Так что тот кто перенес знает, что делает.


 
Игорь Шевченко ©   (2009-06-10 15:17) [7]


> в том то и вопрос что они не могут искать только папки
> и нахождение 1 папки среди 8000 файлов например затянеца


Тот, кто перенес из Winapi в курсе, что папка и файл с точки зрения файловой системы одно и то же.
Тот, кто перенес из WinApi в курсе, что в справке у FindFirst написано, что параметр Attr: Integer определяет, какие файлы будут в результате поиска


 
Ega23 ©   (2009-06-10 15:30) [8]


> в том то и вопрос что они не могут искать только папки
> и нахождение 1 папки среди 8000 файлов например затянеца


Да ну?


 
QAZ   (2009-06-10 15:36) [9]


> справке у FindFirst написано, что параметр Attr: Integer
> определяет

нихрена он ничего не определяет\не работает

> Да ну?

ну да

реч идет о поиске папок вообще (*) а не с конкретным именем(folderxyz)


 
Игорь Шевченко ©   (2009-06-10 15:44) [10]


> нихрена он ничего не определяет\не работает


странно, у меня работает.


 
DVM ©   (2009-06-10 15:44) [11]


> QAZ


> и нахождение 1 папки среди 8000 файлов например затянеца

Ну среди 8000 не особо то и затянется, но вот среди миллиона да, будет не очень быстро. Но вообще то, если есть необходимость в столь быстром поиске среди большого количества файлов, то сведения о них надо заранее поместить в БД. Тогда поиск будет занимать доли секунды, практически независимо от количества записей о файлах. В фоновом режиме база должна регулярно пополняться/обновляться, если файлы и папки меняются.


 
Dennis I. Komarov ©   (2009-06-10 16:00) [12]

Syntax

[Delphi] function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

Description
FindFirst searches the directory specified by Path for the first file that matches the file name implied by Path and the attributes specified by the Attr parameter. The result is returned in the F parameter. Use the fields of this search record to extract the information needed. FindFirst returns 0 if a file was successfully located, otherwise, it returns an error code.

The Path constant parameter is the directory and file name mask, including wildcard characters. For example, ".\test\*.*" specifies all files in the test subdirectory.

The Attr parameter specifies the special files to include in addition to all normal files. Choose from these file attribute constants when specifying the Attr parameter:
  Constant  Description
faReadOnly
Read-only files

faHidden
Hidden files

faSysFile
System files

faVolumeID
Volume ID files

faDirectory
Directory files

faArchive
Archive files

faAnyFile
Any file


Attributes can be combined by adding (Delphi) or or-ing (C++) their constants or values. For example, to search for read-only and hidden files in addition to normal files, pass (faReadOnly + faHidden) in Delphi or (faReadOnly | faHidden) in C++ as the Attr parameter. To include only normal files, pass zero for the Attr parameter.


 
QAZ   (2009-06-10 16:02) [13]


> странно, у меня работает.

тоесть при поиске папки с именем "*"
в папке с парой сотен файлов и одной папкой "yes"
она находится на 3й итерации цикла ? :)


 
Игорь Шевченко ©   (2009-06-10 16:17) [14]

QAZ   (10.06.09 16:02) [13]

Уел :) Не на третьей.

Пришлось написать для FindFirst и обнаружить строчку в Sysutils.pas

const
 faSpecial = faHidden or faSysFile or faDirectory;
...
 F.ExcludeAttr := not Attr and faSpecial;

Приношу извинения.


 
Riply ©   (2009-06-10 17:47) [15]

> [5] QAZ   (10.06.09 14:57)
> и нахождение 1 папки среди 8000 файлов например затянеца

Можно ускорится, например, при помощи NtQueryDirectoryFile.


 
clickmaker ©   (2009-06-10 17:59) [16]

> в том то и вопрос что они не могут искать только папки
> и нахождение 1 папки среди 8000 файлов например затянеца

если все файлы на букву А, а папка - на Я ?


 
Игорь Шевченко ©   (2009-06-10 18:07) [17]


> Можно ускорится, например, при помощи NtQueryDirectoryFile.


согласно Неббету, NtQueryDirectoryFile - это то, во что превращается вызов FindFirst


 
QAZ   (2009-06-10 18:37) [18]


> если все файлы на букву А, а папка - на Я ?

именно так

> Пришлось написать для FindFirst и обнаружить строчку в Sysutils.
> pas
>
> const
>  faSpecial = faHidden or faSysFile or faDirectory;
> ...
>  F.ExcludeAttr := not Attr and faSpecial;

тут я чесно не въехал
я не пользуюсь VCLными надстройками над надстройками над winapi
чистая FindFirstFile и FindNextFile не получает атрибуты поиска, а возвращает
атрибуты найденых файлов


 
QAZ   (2009-06-10 18:41) [19]

а VCLными FindFirst и FindNext используют цикл в FindMatchingFile для фильтровки


 
Игорь Шевченко ©   (2009-06-10 19:15) [20]

QAZ   (10.06.09 18:37) [18]

В файловой системе каталог - это тот же файл. Чтобы найти вложенные каталоги, надо пересмотреть все содержимое текущего


 
Riply ©   (2009-06-10 19:44) [21]

> [17] Игорь Шевченко ©   (10.06.09 18:07)
> согласно Неббету, NtQueryDirectoryFile - это то, во что превращается вызов FindFirst

Совершенно верно.
Но у нее есть очень занимательный параметр: RetSingleEntry: BOOLEAN;
Если подготовиться примерно таким образом:
1. выбрать для сканирования соответствующий FILE_INFORMATION_CLASS, например, FileDirectoryInformation
 (там, вроде, для подобного сканирования аж четыре разных FILE_INFORMATION_CLASS)
2. установить RetSingleEntry в False
3. если рекурсия - использовать Handle родителя для открытия вложенного объекта
4. всякие мелочи :)

то выигрыш может оказаться ~ 50% на индексированном диске и ~ 25% на неиндексированном.


 
Игорь Шевченко ©   (2009-06-10 20:04) [22]

Riply ©   (10.06.09 19:44) [21]


> Но у нее есть очень занимательный параметр: RetSingleEntry:
>  BOOLEAN;


Да, сколько порций fileinformation возвращать за один вызов.


> выбрать для сканирования соответствующий FILE_INFORMATION_CLASS,
>  например, FileDirectoryInformation
>  (там, вроде, для подобного сканирования аж четыре разных
> FILE_INFORMATION_CLASS)


говорят, 36, но тех, которые возвращают атрибуты, наверное меньше.


> 2. установить RetSingleEntry в False


Это определяет, сколько раз придется вызвать функцию для полного сканирования каталога.
Я к другому - насколько мне известно, в системе не существует метода, который просматривает только каталоги, игнорируя при этом остальные файлы.


 
QAZ   (2009-06-10 20:23) [23]


> Я к другому - насколько мне известно

ну канешно :) теперь уже известно


 
QAZ   (2009-06-10 20:24) [24]

уточню\упрощу вопрос
есть ли кашерный способ узнать что в папке есть папка ?


 
Riply ©   (2009-06-10 20:41) [25]

> [22] Игорь Шевченко ©   (10.06.09 20:04)
> Я к другому - насколько мне известно, в системе не существует метода,
> который просматривает только каталоги, игнорируя при этом остальные файлы.

Я бы выразилась более осторожно: пока, мы не сумели найти такой метод :)


 
Игорь Шевченко ©   (2009-06-10 20:50) [26]

Riply ©   (10.06.09 20:41) [25]

А собственно, перечень для поиска известен - API


 
Германн ©   (2009-06-11 01:29) [27]


> Riply ©   (10.06.09 20:41) [25]
>
> > [22] Игорь Шевченко ©   (10.06.09 20:04)
> > Я к другому - насколько мне известно, в системе не существует
> метода,
> > который просматривает только каталоги, игнорируя при этом
> остальные файлы.
>
> Я бы выразилась более осторожно: пока, мы не сумели найти
> такой метод :)
>


> Игорь Шевченко ©   (10.06.09 20:50) [26]
>
> Riply ©   (10.06.09 20:41) [25]
>
> А собственно, перечень для поиска известен - API


С вероятностью 99.9(9)% такого метода нет. Файловые системы применяющиеся сейчас известны уже очень давно. Был бы метод - давно он был бы известен.
:)
Но Саша может (если займётся) изобрести что-то что позволит ускорить поиск. :)


 
Германн ©   (2009-06-11 01:52) [28]


> QAZ   (10.06.09 20:24) [24]
>
> уточню\упрощу вопрос
> есть ли кашерный способ узнать что в папке есть папка ?
>

Ещё раз уточню суть вещей.
Для файловых систем используемых ОС Windows/MSDOS  папка есть файл с атрибутом faDirectory. И никак, кроме банального перебора всех файлов, их (папок) не найти.


 
Anatoly Podgoretsky ©   (2009-06-11 07:41) [29]


> есть ли кашерный способ узнать что в папке есть папка ?

Нет папок, есть файлы с особыми признаками.


 
QAZ   (2009-06-11 09:40) [30]

на самом деле есть полукашерный способ определения
наличия папки за 3 шага цикла
я его пару лет назад нашел,а существует он с начала времен
есть тока один недостаток - не определяет папки с "неправильным" именем

поэтому и возник вопрос,веть хоть папка и есть "файл"(это функции работы с файлами её делают файлом,по жизни это может просто запись в таблице файлов)
то один фиг к ней привязаны файлы которыми она владеет
значит она должна както по особому храница на уровне ФС и соответсвено находится


 
blurcode   (2009-06-11 10:38) [31]


> QAZ   (11.06.09 09:40) [30]

RTFM. Тебе уже сотню раз сказали.


> поэтому и возник вопрос,веть хоть папка и есть "файл"(это
> функции работы с файлами её делают файлом,по жизни это может
> просто запись в таблице файлов)то один фиг к ней привязаны
> файлы которыми она владеетзначит она должна както по особому
> храница на уровне ФС и соответсвено находится

Вон у Riply © поспрашивай она на этом собаку съела.


 
clickmaker ©   (2009-06-11 11:18) [32]

> есть ли кашерный способ узнать что в папке есть папка ?

попробовать удалить


 
QAZ   (2009-06-11 11:28) [33]


> RTFM

интересно какой :)

> попробовать удалить

удалить что? имя папки неизвесно :D


 
clickmaker ©   (2009-06-11 11:32) [34]

> имя папки неизвесно

ну значит вероятность того, что в ней есть папка - 50%: либо есть, либо нет o)


 
blurcode   (2009-06-11 11:36) [35]


> QAZ   (11.06.09 11:28) [33]
> > RTFM интересно какой :)

По ФС


 
QAZ   (2009-06-11 11:51) [36]

Удалено модератором


 
blurcode   (2009-06-11 11:53) [37]

Удалено модератором


 
QAZ   (2009-06-11 11:58) [38]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.005 c
15-1244798237
Артур Пирожков
2009-06-12 13:17
2009.08.09
Почему в Explore грузится, а в Опере или Лисе нет?


15-1243715424
Юрий
2009-05-31 00:30
2009.08.09
С днем рождения ! 31 мая 2009 воскресенье


15-1244082212
alert2006
2009-06-04 06:23
2009.08.09
Помогите решить задачу


2-1244657306
dnepr
2009-06-10 22:08
2009.08.09
Окно программы виснет


15-1244613139
Василий Иванов_22
2009-06-10 09:52
2009.08.09
уравнение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский