Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.07;
Скачать: CL | DM;

Вниз

Работа с директориями   Найти похожие ветки 

 
^^^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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
1-20510
aa5E1
2003-07-25 13:44
2003.08.07
Ожидание завершение запущеной программы


14-20749
Ahmad K
2003-07-15 23:18
2003.08.07
Можноли


14-20738
Cmenil
2003-07-20 16:42
2003.08.07
Вот как узнать когда...


14-20668
berezuev
2003-07-22 19:19
2003.08.07
Как уменьшить размер DELPHI exe-шника? 500Kb - многовато!


14-20688
gfksx
2003-07-23 03:06
2003.08.07
Нужен совет по сокетам в обмен на USD