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

Вниз

Файлы, директории   Найти похожие ветки 

 
Pascha   (2002-08-09 13:17) [0]

Как можно прочитать все файлы и директории,поддиректории с диска. Вывести например в Memo. Сделал прогу, но она лазиет поверху диска. Хотелось бы прогуляться до корней диска.


 
ZrenBy ©   (2002-08-09 13:22) [1]

Я на коленке для разового использования сделал енто

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);


 
Viktor Kushnir ©   (2002-08-10 08:45) [2]

Помоему даже работает.
Только 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;


 
Anatoly Podgoretsky ©   (2002-08-10 09:39) [3]

Вопросы про FindFirst видимо никогда не кончатся, это наказание этого сайта


 
Suntechnic ©   (2002-08-10 09:52) [4]

>Anatoly Podgoretsky © (10.08.02 09:39)
Это карма :)


 
Anatoly Podgoretsky ©   (2002-08-10 10:03) [5]

Да злая карма


 
Pascha   (2002-08-10 21:21) [6]

Простите за назойливость, пробовал оба варианта и не один не компиллируется. Во втором примере процедура называется FindFiles и в теле её же она сама себя должна вызвать? У меня не получаеется почему-то? Но все же всем спасибо.
Может кто написать рабочий пример?


 
Anatoly Podgoretsky ©   (2002-08-10 21:33) [7]

Если у вас все равно не получается, то самое время посмотреть документацию.
На данном сайте это FAQ


 
Pascha   (2002-08-10 22:27) [8]

Код программы где закавыка что добавить, выводит только верхний уровень файлов и директорий

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;


 
Viktor Kushnir ©   (2002-08-11 08:49) [9]

В общем алгортм такой, когда ты получишь список папок на диске например C:\ тебе надо тем же самым кодом обработать все эти папки C:\Windows; C:\Program Files и т. д., а затем для каждой новой папки обработать список её подпапок и так далее, пока не кончится дерево папок.
А вызов процедуры из самой себя называется рекурсией. В этом случае очень удобно. И где,кстати в моем коде глюк?


 
Pascha   (2002-08-13 20:39) [10]

Дико извиняюсь уважаемый Viktor Kushnir и все-все-все я сам во всём виноват, не подумал, простите. Всё работает. И за "рекурсию" тоже спасибо я и не подозревал что такое бывает. До новых встреч (я надеюсь Вы простите).


 
star ©   (2002-08-16 00:35) [11]

Да-а-а, вырождается племя программисткое, про рекурсию им уже не известно ... Как же Вы будете факториал считать, например ...


 
Suntechnic ©   (2002-08-16 08:27) [12]

>star © (16.08.02 00:35)
Да факториал это как раз и без рекурсии запросто можно. А вот обход дерева... впрочем о чём это я... какие деревья, если народ про рекурсию из форума узнаёт :|


 
Star ©   (2002-08-16 08:35) [13]

Кстати, обход дерева тоже можно сделать без рекурсии. Меня, как эстета, более интересует не работоспособность кода, а его элегантность и работоспособность. Рекурсия - решение элегантное и работоспособное.



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
14-8156
Undert
2002-09-09 16:24
2002.10.03
Шоу


1-7992
Semion
2002-09-21 07:49
2002.10.03
Напомните


3-7835
Radimir
2002-09-12 14:59
2002.10.03
динамический SQL


14-8110
Ketmar
2002-09-05 09:57
2002.10.03
где менять цвет текста в Object Inspector е?


7-8194
rastochnik
2002-07-26 16:40
2002.10.03
compaq armada 7400 - подскажите, как в bios попасть?