![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с прохожднием всех каталогов [D7, WinXP]
Freeon © (2005-11-02 00:33:00)Суть в том что в определенном каталоке (C:\INF) существуют подкаталоги в них еще подкаталоги............... в каждом каталоге также имеются и файлы.
как можно записать адреса всех файловиз родительского каталога(C:\INF\) и всех дочерних каталогов
например в C:\Log.txt чтобы получилос что-то похожее на
c:\inf\kil.doc
c:\inf\atf.exe
c:\inf\exe\bpx.exe
...........................
c:\inf\..................
Заранее спасибо
wp2 (2005-11-03 21:47:00) [1]
> to wp2 из моего кода видно - я знаю, что такое рекурсия
Так чё тогда спрашиваешь?
Freeon (2005-11-02 22:42:00) [2]Всем спасибо, сам пробовал,у меня получилось так
Procedure FirstScanDir(Dir:string);
var SearchRec:TSearchRec;
f:textfile;
begin
if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\';
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.name='.') or (SearchRec.name='..') then continue;
if (SearchRec.Attr and faDirectory)<>0 then
FirstScanDir(Dir+SearchRec.name) //we found Directory
else
begin
assignfile(f,'1.txt');
If not FileExists('1.txt') then rewrite(f) else append(f);
writeln(f,Dir+SearchRec.name);
closefile(f);
end;
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
end;
to wp2 из моего кода видно - я знаю, что такое рекурсия
wp2 (2005-11-02 20:26:00) [3]
> Суть в том что в определенном каталоке (C:\INF) существуют
> подкаталоги в них еще подкаталоги............... в каждом
> каталоге также имеются и файлы.
> как можно записать адреса всех файлов из родительского каталога(C:
> \INF\) и всех дочерних каталогов
> например в C:\Log.txt чтобы получилос что-то похожее на
Вы бы сперва выучили такое понятие как рекурсия...
Cvin (2005-11-02 15:56:00) [4]В предыдущем коде накосячил малость... Вот работающий пример
var
fndFile,fndFolder: WIN32_FIND_DATA;
procedure FindAndSave (const StartD: String);
var
hSRFile,hSRFolder: THandle;
F: TextFile;
begin
hSRFile := FindFirstFile(PChar(StartD+'*.*'),fndFile);
if hSRFile <> INVALID_HANDLE_VALUE then
begin
CloseHandle(CreateFile('c:\IamLog.log',GENERIC_WRITE,0,nil,OPEN_ALWAYS,0,0));
repeat
if (fndFile.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) =
FILE_ATTRIBUTE_DIRECTORY
then
Continue;
try
AssignFile(F,'c:\IamLog.log');
Append(F);
try
WriteLn(F,StartD+fndFile.cFileName);
finally
CloseFile(F);
end;
except
Application.MessageBox('Что-то пошло не так...','Запор при записи в файл',0);
end;
until not FindNextFile(hSRFile,fndFile);
Windows.FindClose(hSRFile);
end;
hSRFolder := FindFirstFile(PChar(StartD+'*.*'),fndFolder);
if hSRFolder <> INVALID_HANDLE_VALUE then
begin
repeat
if ((fndFolder.dwFileAttributes and
FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
(fndFolder.cFileName <> '..') and (String(fndFolder.cFileName) <> '.')
then
FindAndSave(StartD+fndFolder.cFileName+'\');
until not FindNextFile(hSRFolder,fndFolder);
Windows.FindClose(hSRFolder);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FindAndSave('c:\'); // слэш указывать обязательно, т.к процедура не проверяет его наличия
end;
Cvin (2005-11-02 14:52:00) [5]
var
fndFile,fndFolder: WIN32_FIND_DATA; // чтобы не забивать стэк
procedure FindAndSave (const StartD: String);
var
hSRFile,hSRFolder: THandle;
F: TextFile;
begin
hSRFile := FindFirstFile('*.*',fndFile);
if hSRFile <> INVALID_HANDLE_VALUE then
begin
CloseHandle(CreateFile('c:\IamLog.log',GENERIC_WRITE,0,nil,OPEN_ALWAYS,0,0));
AssignFile(F,'c:\IamLog.log');
try
Append(F);
try
repeat
if (fndFile.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) =
FILE_ATTRIBUTE_DIRECTORY
then
Continue;
WriteLn(F,StartD+fndFile.cFileName);
until not FindNextFile(hSRFile,fndFile);
Windows.FindClose(hSRFile);
finally
CloseFile(F);
end;
except
Application.MessageBox('Что-то пошло не так...','Запор при записи в файл',0);
end;
end;
hSRFolder := FindFirstFile(PChar(StartD+'*.*'),fndFolder);
if hSRFolder <> INVALID_HANDLE_VALUE then
begin
repeat
if ((fndFolder.dwFileAttributes and
FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
(fndFolder.cFileName <> '..') and (String(fndFolder.cFileName) <> '.')
then
FindAndSave(StartD+fndFolder.cFileName+'\');
until not FindNextFile(hSRFolder,fndFolder);
Windows.FindClose(hSRFolder);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FindAndSave('c:\');
end;
KorvinOE (2005-11-02 09:52:00) [6]С помощью FindFirst/FindNext находишь по порядку все объекты в папке и определяешь папка это или файл. Если файл то сохраняешь его адрес, а если каталог - выполняешь эту же ф-цию для этого каталога :)
Плохиш (2005-11-02 01:02:00) [7]AssignFile/Rewrite/Write(ln)/CloseFile - работа с текстовыми файлами
FindFirst/FindNext + рекурсия - поиск файлов/каталогов в заданном каталоге
Книжки по программированию/встроенная справка - теория программирования