Привет народ! Надо найти файлы в заданном каталоге. Задача такова что, мне нужно записать все полные пути файлов в массив. Так как я не знаю заранее сколько файлов будет, решил использовать динамические массивы. Вот моя процедура:
Код
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. Как я из него данные прочитаю? Разом однако не получиться.
Вопрос: Как сохранять большие объемы текстовых данных? И как их потом прочитать с наибольшей скоростью? [email protected]
Дата: Воскресенье, 04.01.2015, 22:49 | Сообщение # 6
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
ЦитатаC@T ()
давно мечтаю что бы на этом форуме был раздел с плюсами или хотя бы с шарпом, с радостью бы отвечал на вопросы по плюсам
Согласен, в идеале нужно переориентировать или точнее чуть чуть расширить форум из разряда "Вирусология взгляд из Delphi" в "Вирусология взгляд из Delphi & C" или "Вирусология взгляд из Delphi & C++"