![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файлы, директории [D3, Win95/98]
Pascha © (2002-08-09 13:17:00)Как можно прочитать все файлы и директории,поддиректории с диска. Вывести например в Memo. Сделал прогу, но она лазиет поверху диска. Хотелось бы прогуляться до корней диска.
Star (2002-08-16 08:35:00) [1]Кстати, обход дерева тоже можно сделать без рекурсии. Меня, как эстета, более интересует не работоспособность кода, а его элегантность и работоспособность. Рекурсия - решение элегантное и работоспособное.
Suntechnic (2002-08-16 08:27:00) [2]>star © (16.08.02 00:35)
Да факториал это как раз и без рекурсии запросто можно. А вот обход дерева... впрочем о чём это я... какие деревья, если народ про рекурсию из форума узнаёт :|
star (2002-08-16 00:35:00) [3]Да-а-а, вырождается племя программисткое, про рекурсию им уже не известно ... Как же Вы будете факториал считать, например ...
Pascha (2002-08-13 20:39:00) [4]Дико извиняюсь уважаемый Viktor Kushnir и все-все-все я сам во всём виноват, не подумал, простите. Всё работает. И за "рекурсию" тоже спасибо я и не подозревал что такое бывает. До новых встреч (я надеюсь Вы простите).
Viktor Kushnir (2002-08-11 08:49:00) [5]В общем алгортм такой, когда ты получишь список папок на диске например C:\ тебе надо тем же самым кодом обработать все эти папки C:\Windows; C:\Program Files и т. д., а затем для каждой новой папки обработать список её подпапок и так далее, пока не кончится дерево папок.
А вызов процедуры из самой себя называется рекурсией. В этом случае очень удобно. И где,кстати в моем коде глюк?
Pascha (2002-08-10 22:27:00) [6]Код программы где закавыка что добавить, выводит только верхний уровень файлов и директорий
var
Form1: TForm1;
FindHandle : THandle;
FindData : TWin32FindData;
b : boolean;
s : String;
implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
p : String;
begin
Memo1.Clear;
FindData.dwFileAttributes := FILE_ATTRIBUTE_NORMAL;
p:=Copy(DriveComboBox1.Text,1,2);
FindHandle := FindFirstFile(Pchar(p+"\*.*"),FindData);
if FindHandle <> INVALID_HANDLE_VALUE then
begin
b:=true;
while b do
begin
s:=FindData.cFileName;
if (s<>"..") and (s<>".") then
Memo1.lines.Add(p+"\"+s);
b:=FindNextFile(FindHandle,FindData);
end;
end;
end;
Anatoly Podgoretsky (2002-08-10 21:33:00) [7]Если у вас все равно не получается, то самое время посмотреть документацию.
На данном сайте это FAQ
Pascha (2002-08-10 21:21:00) [8]Простите за назойливость, пробовал оба варианта и не один не компиллируется. Во втором примере процедура называется FindFiles и в теле её же она сама себя должна вызвать? У меня не получаеется почему-то? Но все же всем спасибо.
Может кто написать рабочий пример?
Anatoly Podgoretsky (2002-08-10 10:03:00) [9]Да злая карма
Suntechnic (2002-08-10 09:52:00) [10]>Anatoly Podgoretsky © (10.08.02 09:39)
Это карма :)
Anatoly Podgoretsky (2002-08-10 09:39:00) [11]Вопросы про FindFirst видимо никогда не кончатся, это наказание этого сайта
Viktor Kushnir (2002-08-10 08:45:00) [12]Помоему даже работает.
Только memo не используй, лучше что-нибудь более вместительное, у мемо может не хватить памяти под все папки и файлы.
Вызов FindFiles("c:");
sfind :boolean; если равна true, то надо завершить поиск (например если хочешь закрыть программу)
Procedure FindFiles(Path: String);
var
SearchRec: TSearchRec;
begin
Application.ProcessMessages;
If (path <> "") and (not sfind) then
begin
if (FindFirst(Path+"\"+"*.*", faAnyFile, SearchRec) = 0) then
begin
FileList.Items.Add(Path+"\"+SearchRec.Name);
While (FindNext(SearchRec) = 0) do
Begin
FileList.Items.Add(Path+"\"+SearchRec.Name);
If DirectoryExists(Path+"\"+SearchRec.Name) and (SearchRec.Name <> "..")
and (SearchRec.Name <> "...") then FindFiles(Path+"\"+SearchRec.Name);
Application.ProcessMessages;
End;
end;
end;
FindClose(SearchRec);
end;
ZrenBy (2002-08-09 13:22:00) [13]Я на коленке для разового использования сделал енто
procedure U_CopyAll(sSrc,sTrg:String);
var nRes:Integer; SR:TSearchRec;
begin
{$I-} MkDir(sTrg); {$I+} IOResult;
nRes := FindFirst(sSrc+"*.*", faAnyFile, SR);
while nRes=0 do begin
if((SR.Name<>".")and(SR.Name<>".."))then begin
if( (SR.Attr and faDirectory)>0 )then begin
U_CopyAll(sSrc+SR.Name+"\",sTrg+SR.Name+"\");
end else begin
WriteLn(fF,"copy ""+U_WinToDos(sSrc+SR.Name)+"" ""+U_WinToDos(sTrg)+"*.*"");
end;
end;
nRes := FindNext(SR);
end;
SysUtils.FindClose(SR);