Привет народ! Надо найти файлы в заданном каталоге. Задача такова что, мне нужно записать все полные пути файлов в массив. Так как я не знаю заранее сколько файлов будет, решил использовать динамические массивы. Вот моя процедура:
Код
procedure ScanDir(StartDir: string; Mask: string; list: array of string); var SearchRec: TSearchRec; i: integer; begin i:= 0; if Mask = '' then Mask := '*.*';
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then begin repeat if (SearchRec.Attr and faDirectory) <> faDirectory then //если не папка begin i := Length(list); SetLength(list, Succ(i)); list[i]:=StartDir + SearchRec.Name; //добавляем файл в динамичский массив! end else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then begin //если папка, но не текущая и не та которая уровнем выше i := Length(list); SetLength(list, Succ(i)); ScanDir(StartDir + SearchRec.Name + '\', Mask, list[i]); //ищем файлы в подкаталогах (или это сейчас не надо?) end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); //очищаем структуру end; end;
Для этого надо использовать специальные структуры данных "список" Вот,глянь. А что бы не писать всё вручную,можно воспользоваться уже написанным кодом. Используй класс TStringList. Процедуру поиска файлов я взял отсюда и чуток переделал. Вот,что получилось:
Код
procedure FindFiles(StartFolder, Mask: string; List: TStringList; ScanSubFolders: Boolean = True); var SearchRec: TSearchRec; FindResult: Integer; begin List.BeginUpdate; try StartFolder := IncludeTrailingBackslash(StartFolder); FindResult := FindFirst(StartFolder + '*.*', faAnyFile, SearchRec); try while FindResult = 0 do with SearchRec do begin if (Attr and faDirectory) <> 0 then begin if ScanSubFolders and (Name <> '.') and (Name <> '..') then FindFiles(StartFolder + Name, Mask, List, ScanSubFolders); end else begin if MatchesMask(Name, Mask) then List.Add(StartFolder + Name); end; FindResult := FindNext(SearchRec); end; finally FindClose(SearchRec); end; finally List.EndUpdate; end; end;
procedure TForm1.Button2Click(Sender: TObject); var strs: TStringList; i: integer; begin strs:=TStringList.Create; FindFiles('C:\','*.jpg',strs,False); for i:=0 to strs.Count-1 do Memo1.Lines.Add(strs[i]); end;
P.S Masks в uses))) А если бы ты писал на C++,то там есть такая штука как STL и контейнер VECTOR
Сообщение отредактировал Neo - Суббота, 03.01.2015, 09:48
Дата: Воскресенье, 04.01.2015, 14:16 | Сообщение # 4
Был не раз
Зарегистрирован: 04.09.2014
Группа: Пользователи
Сообщений: 11
Статус: Offline
Ок. Все круто. Заюзал TStringList. Вопрос немного не в тему, но все же. Данные о найденных файлах надо где то хранить. Пытался сохранить список в файл, но когда обьем строк ~500mb (столько прога выжирает RAM - надо бороться с этим...), все!
Код
filelist.SaveToFile('list_of_files.txt');
Не сохраняет. Ладно, думаю буду поочередно добавлять в файл найденные строки, но потом подумал, а что если моя прога запуститься у юзера у которого HDD 2Tb ??? И так файлик получиться мегабайт так ~100. Как я из него данные прочитаю? Разом однако не получиться. Вопрос: Как сохранять большие объемы текстовых данных? И как их потом прочитать с наибольшей скоростью? mr.toorook@jabber.ru
Дата: Воскресенье, 04.01.2015, 22:49 | Сообщение # 6
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
ЦитатаC@T ()
давно мечтаю что бы на этом форуме был раздел с плюсами или хотя бы с шарпом, с радостью бы отвечал на вопросы по плюсам
Согласен, в идеале нужно переориентировать или точнее чуть чуть расширить форум из разряда "Вирусология взгляд из Delphi" в "Вирусология взгляд из Delphi & C" или "Вирусология взгляд из Delphi & C++"