
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.138] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как получить список всех файлов в определённой директории ?
|
Сообщ.
#2
,
|
|
|
А в FAQ заходить не пробовали?
|
Сообщ.
#3
,
|
|
|
Go to FAQ
|
![]() |
Сообщ.
#4
,
|
|
Ошибки в Факе на эту тему.
![]() Вот та процедура, что там предлагается: ![]() ![]() Procedure ScanDir(StartDir: String; Mask:string; List:TStrings); { Процедура выводит список директории в список List, начиная с директории, указанной в StartDir. Mask - маска для получения файлов Источник delphi.mastak.ru © А. Подгорецкий } Var SearchRec : TSearchRec; Begin IF Mask ='' then Mask:= '*.*'; IF StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\'; IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then Begin Repeat { Чтобы выполнение "не подвисало" } Application.ProcessMessages; IF (SearchRec.Attr and faDirectory) <> faDirectory then List.Add(StartDir + SearchRec.Name) else IF (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then Begin List.Add(StartDir + SearchRec.Name + '\'); { Рекурсивный вызов } ScanDir(StartDir + SearchRec.Name + '\',Mask,List); End; Until FindNext(SearchRec) <> 0; FindClose(SearchRec); End; {IF} end; Ошибка 1: ![]() ![]() IF (SearchRec.Attr and faDirectory) <> faDirectory then Это еще что за условие? Оно ж ВСЕГДА выполнятся будет. Ошибка 2: Если задать маску отличную от *.* - то не найдется ни одно вложение в подпапках, так как имена папок тоже фильтрируются по этой маске. |
Сообщ.
#5
,
|
|
|
Цитата Chow @ 27.04.04, 14:52 Ошибка 1: ![]() ![]() IF (SearchRec.Attr and faDirectory) <> faDirectory then Это еще что за условие? Оно ж ВСЕГДА выполнятся будет. faDirectory - это атрибут директории (типа папка) и если в атрибуте присутствует атрибут faDirectory , то такие варианты исключаются...т.е. папки не будут указываться в списке... |
![]() |
Сообщ.
#6
,
|
|
Сори. Тормознул, наверное, малёха.
![]() Тут побитное and, а не логическое, да? (в С++ есть разница & и && - соответственно). ОК. Ну, а на счет маски? Может тоже все нормально в ФАКЕ - просто я чего-то туплю?... ![]() |
Сообщ.
#7
,
|
|
|
Цитата Chow @ 27.04.04, 16:08 Цитата Если задать маску отличную от *.* - то не найдется ни одно вложение в подпапках, так как имена папок тоже фильтрируются по этой маске. ОК. Ну, а на счет маски? Может тоже все нормально в ФАКЕ - просто я чего-то туплю?... ![]() если задашь маску *.* - то выберутся все файлы из всех папок и подпапок... если задашь *.txt, то выберуться только текстовые файлы...ну и т.д. сами папки в список не попадут, т.к. мы их отсеяли атрибутом, а маской отсееваем по именам... |
Сообщ.
#8
,
|
|
|
Есессно получу минус в рейтинге, но в очередной раз удивляет реакция ( во времени) уже не модератора, а администратора Song-а
С уважением |
Сообщ.
#9
,
|
|
|
Vestnik, когда я писал своё сообщение я не видел сообщения Vit'а. Вот в чём секрет.
|
![]() |
Сообщ.
#10
,
|
|
Цитата Song, 27.04.04, 23:50 я не видел сообщения Vit'а А можно поподробнее? Почему у вас время ответа такое разное? А не первый раз замечаю, что сообщений друг друга не видите ![]() |
![]() |
Сообщ.
#11
,
|
|
Цитата Генерал, 27.04.04, 18:45 если задашь маску *.* - то выберутся все файлы из всех папок и подпапок... если задашь *.txt, то выберуться только текстовые файлы... ... только из ТЕКУЩЕЙ папки. Все файлы из подпапок текущей папки не попадают. Т.к. маска *.txt фильтрирует не только список файлов, но и список папок (папки тоже ш могут иметь расширение). Коротче: постараюсь доделать сам. Просто поднял топик, что-бы обратить внимание на возможную ошибку в ФАКе. |
![]() |
|
|
Цитата Chow @ 28.04.04, 08:48 Цитата Генерал, 27.04.04, 18:45 если задашь маску *.* - то выберутся все файлы из всех папок и подпапок... если задашь *.txt, то выберуться только текстовые файлы... ... только из ТЕКУЩЕЙ папки. Все файлы из подпапок текущей папки не попадают. Т.к. маска *.txt фильтрирует не только список файлов, но и список папок (папки тоже ш могут иметь расширение). если встречается папка, то программа вызывает саму себя для этой подпапки и поиск идёт уже в подпапке..вот тут: Цитата { Рекурсивный вызов } ScanDir(StartDir + SearchRec.Name + '\',Mask,List); ...и т.д., пока не просмотрит все подпапки... так что в факе всё прально... |
![]() |
Сообщ.
#13
,
|
|
Цитата Генерал, 28.04.04, 11:08 если встречается папка, то программа вызывает саму себя для этой подпапки и поиск идёт уже в подпапке..вот тут: В том то и дело, что папка НЕ встречается, т.к. не удовлетворяет маску *.txt ![]() ![]() IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then Например я задам StartDir = 'C:\Temp\', а Mask = '*.txt'. Процедура найдет все тхт-файлы лишь в папке C:\Temp\. А если в этой папке будут подпапки: C:\Temp\1\ C:\Temp\2.txt\ C:\Temp\3\ то она заглянет лишь в C:\Temp\2.txt\, а C:\Temp\1\ и C:\Temp\3\ пропустит, т.к. они не удовлетворяют условию поиска. |
![]() |
|
|
сначала анализируется атрибут:
Цитата IF (SearchRec.Attr and faDirectory) <> faDirectory then если это не папка (<> faDirectory), то это файл (естесно), и если у него расширение .тхт, то он попадает в список: Цитата List.Add(StartDir + SearchRec.Name если это папка, то выполняется сначала проверка, системная ли это папка: Цитата IF (SearchRec.Name <> '..') and (SearchRec.Name <> '.' если не системная, то программа вызывает саму себя, а в качестве папки задаёт подпапку: Цитата { Рекурсивный вызов } ScanDir(StartDir + SearchRec.Name + '\',Mask,List); ну вот, вроде всё разжевал и по полочкам разложил... ![]() |
![]() |
Сообщ.
#15
,
|
|
Цитата Генерал, 28.04.04, 12:19 ну вот, вроде всё разжевал и по полочкам разложил... А реально попробовать? ![]() Самое первое условие не проходит: ![]() ![]() IF FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then если, например, в папке C:\Temp\ нету ни одного файла, а только подпапки в которых есть уже файлы. |
![]() |
|
|
Цитата Chow @ 28.04.04, 12:30 А реально попробовать? ![]() вот теперь тебе осталось сесть и реально пробывать...и ответы на свои вопросы найдёшь! ...можешь есчо книжечку по дельфи почитать...там тоге всё хорошо написано... ![]() |
![]() |
Сообщ.
#17
,
|
|
Это был мой совет вам, на счет попробовать.
Сам я уже давно попробовал - поэтому и поднял топик. |
![]() |
|
|
всё работает1
вот уж не поленился, поставил на форму кнопочку и ListBox... скопировал программку из фака, которую ты выложил...один к одному... давлю на кнопочку... а в листбоксе - чудо!.... список всех файлов из папки, которую я задал!...ну и из всех попдпапок соответственно! ![]() |
![]() |
Сообщ.
#19
,
|
|
Цитата Генерал, 28.04.04, 13:53 список всех файлов А по маске? |
Сообщ.
#20
,
|
|
|
Это не ошибка а процедуре, а ошибка в логике того кто использует, он почему то чситает, что по маске *.txt ему должны выдать и другие папки, которые не устраивают это маске. Маска для навигации должна быть *.*, а поиск должен делаться сравнение файлов с маской поиска.
В моем FAQ есть иакая процедура поиск файла по маске во всех папках по маске *.*. http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N158 |
Сообщ.
#21
,
|
|
|
Цитата Mischka, 28.04.04, 06:05 А можно поподробнее? Почему у вас время ответа такое разное? А не первый раз замечаю, что сообщений друг друга не видите Просто интересно. Интересно? ![]() Да всё просто. Например, прихожу на работу, открываю форум. Там к примеру 10 непрочитанных сообщений. Я их все махом открываю. Потом кто-то приходит, меня напряжёт чем-то либо я переключусь на программу и "увлекусь". Т.е. сообщение открыто в окне без ответов, а в это время на них кто-то отвечает. Потом "оторвусь" от работы, начинаю отвечать, не обновив топики. Вот и всё. ![]() |
![]() |
|
|
Цитата Chow @ 28.04.04, 14:11 Цитата Генерал, 28.04.04, 13:53 список всех файлов А по маске? Chow! Сделай вот так: Цитата Procedure ScanDir(StartDir,Mask: String; List: TStrings); Var SearchRec: TSearchRec; Begin IF Mask=''then Mask:='*.*'; IF StartDir[Length(StartDir)]<>'\'then StartDir := StartDir + '\'; // Сначала находим и печатаем все файлы из // главной папки по маске Mask List.Add(StartDir); IF FindFirst(StartDir+Mask,faAnyFile,SearchRec)=0 then Repeat IF(SearchRec.Attr and faDirectory)<>faDirectory then List.Add(StartDir+SearchRec.Name); Until FindNext(SearchRec)<>0; // Теперь находим все подпапки и продолжаем в них поиск IF FindFirst(StartDir+'*.*',faAnyFile,SearchRec)=0 then Repeat IF((SearchRec.Attr and faDirectory)=faDirectory)and ((SearchRec.Name<>'..')and(SearchRec.Name <> '.'))then ScanDir(StartDir+SearchRec.Name+'\',Mask,List); Until FindNext(SearchRec)<>0; FindClose(SearchRec); end; и будет тебе счастье! ![]() |
Сообщ.
#23
,
|
|
|
Коды в FAQ - это не библиотека, которую можно бездумно подключить и использовать, это только направление в котором думать надо. Простейший пошаговый проход кода с просмотром на каждой строки переменных легко решает все Ваши вопросы. Люди старались попридумывали в Дельфи клавиши - F7, F8, Shift-F7, Ctrl-F5, Ctrl-F7, F4 - вот и надо их использовать, развели демагогию на десяток топиков - а ведь тот код преобразовать под свои нужды работа минут на 10, да разбираться в нём не фиг делать, достаточно ПРОСТО ПОШАГОВО ЕГО ВЫПОЛНИТЬ!
|
![]() |
Сообщ.
#24
,
|
|
Vit, полностью согласен.
Так и сделал с самого начала. Тем более, что я итак переводил все на С++, так что не разобравшись - сделать было бы такой перевод трудно. А поднял топик потому, что подумал что в коде из ФАКа была ошибка (оказалось не ошибка, а я просто криво на С++ перевел ![]() ![]() |