Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-7841
Aristarh
2002-09-10 17:20
2002.10.03
2NickBat: CM-это не Championship Manager?


1-7935
nika_ufc
2002-09-24 00:21
2002.10.03
TStringList


7-8185
wdr
2002-07-23 08:23
2002.10.03
Try..Except...


1-7900
Гость324
2002-09-23 14:01
2002.10.03
Вопрос по описанию массива...


1-8029
dim-
2002-09-22 03:46
2002.10.03
Редактор форм





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский