Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
ВнизРабота с директориями Найти похожие ветки
← →
^^^Dragon^^^ (2003-07-24 22:04) [0]1. Как можно получить список подкаталогов в данном каталоге?
2. Подскажите алгоритм для нахождения файла в катологе, не зная его содержимого (системы подкаталогов)/на диске?
Заранее спасибо!
← →
Song (2003-07-24 22:07) [1]TSearchRec
← →
^^^Dragon^^^ (2003-07-24 22:10) [2]Я, как бы, только учусь, так что можно поподробнее. Как юзать-то??
← →
Palladin (2003-07-24 22:23) [3]1 FAQ
2 если не узнаешь содержимое, не найдешь и файл
← →
^^^Dragon^^^ (2003-07-24 22:24) [4]to Paladin А как тогда Windows файлы ищет (Ctrl+f)?
← →
Anatoly Podgoretsky (2003-07-24 23:02) [5]Смотри в местном чаво пример по фунции FindFirst, а когда Windows файлы ищет, то она тоже этим пользуется, можешь поверить на слово.
← →
JohnJ (2003-07-25 02:20) [6]Недавно написал программу, которое это дело использует! Вот тебе фрагмент кода, который записывает файлы в массив (мастера! Так как я ещё начинающий на дельфи, прошу подсказать мне, где код можно сократить или улучшить).
У меня в StringGrid1 всего один столбец, в котором пользователем указывается список папок, из которых надо "брать" файлы (причём файлы "берутся" не только из них, но и из вложенных в них папок).
procedure CollectFiles(Sender:TObject);
begin
with Form1 do
begin
while StringGrid1.Cells[0,MLD]<>"" do {MLD-кол-во папок
MAF-кол-во всего файлов. MLD и MAF - глобальные переменные}
{Здесь я считываю список папок, заданных пользователем в StringGrid1 в массив ListDir. При создании формы MLD:=0 и MAF:=0}
begin
ListDir[MLD]:=StringGrid1.Cells[0,MLD];
MLD:=MLD+1;
end;
i:=0; j:=0; {Просто счётчик для циклов}
repeat {Каждый раз этот цикл "осматривает" следующую по списку папку}
FindFirst(ListDir[j]+"\*.*",faAnyFile,SR); {Ищет первый файл в j-ой папке. Параметры процедуры можно посмотреть в стандартном хелпе.}
if SR.Attr<>faDirectory then {Если этот "файл" - не вложенная директория, а файл, то записываем его имя в массив}
begin
AllFiles[i]:=SR.Name;
AllPath[i]:=ListDir[j]+"\"+AllFiles[i]; {Мне нужно было не только имя файла, но и полный путь к нему, поэтому я создал два разных массива, хотя, в обычных случаях можно ограничиться только полными путями к файлу}
i:=i+1;
MAF:=MAF+1;
end
{иначе (если этот "файл" - директория, то добавляем его в список папок, как будто она была введёна в StringGrid1}
else if (SR.Name<>"..") and (SR.Name<>".") then
begin
ListDir[MLD]:=ListDir[j]+"\"+SR.Name;
MLD:=MLD+1;
end;
repeat {Этот цикл ищет все остальные файлы, кроме того, что был найден первым}
k:=FindNext(SR); {Ищем следующий файл}
if k=0 then {Если файлы в папке не кончились, то...}
if SR.Attr<>faDirectory then {Идём по тому же алгоритму, что и в случае поиска первого файла}
begin
if i>MaxNuFiles then {Чтобы избежать переполнения массива}
begin
Memo2.Lines.Add("Ошибка, число файлов больше "+IntToStr(MaxNuFiles));
Exit;
end;
AllFiles[i]:=SR.Name;
AllPath[i]:=ListDir[j]+"\"+AllFiles[i];
i:=i+1;
MAF:=MAF+1;
Label4.Caption:=IntToStr(MAF); {Выводим число найденных файлов.}
end
else if (SR.Name<>"..") and (SR.Name<>".")then
begin
ListDir[MLD]:=ListDir[j]+"\"+SR.Name;
MLD:=MLD+1;
end;
until k<>0; {Выходим из цикла, когда в нём кончатся файлы}
FindClose(SR); {Отмечаем что в этой процедуре искать больше нечего (подробней смотри в хелпе)}
j:=j+1; {Переходим к следующей папке в списке}
until j=MLD; {Выходим из цикла, если проверяли последнюю папку в списке}
end;
end;
Алгоритм я придумал сам, так что если есть уже отработанных, просьба сказать, не таить! :) Единственное что я вижу здесь не хватает, это проверка на ошибки, но у меня не получилось её сделать...
← →
JohnJ (2003-07-25 02:22) [7]P.S.:Комментарии писал уже в форуме, атк что если где-то забыл закрыть скобку, закройте её сами... :)
← →
panov (2003-07-25 02:39) [8]>JohnJ © (25.07.03 02:22)
Все же стоит посмотреть в FAQ эту тему...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c