Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
ВнизФайлы, директории Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c