Текущий архив: 2006.01.08;
Скачать: CL | DM;
ВнизПомогите разобраться с прохожднием всех каталогов Найти похожие ветки
← →
Freeon (2005-11-02 00:33) [0]Суть в том что в определенном каталоке (C:\INF) существуют подкаталоги в них еще подкаталоги............... в каждом каталоге также имеются и файлы.
как можно записать адреса всех файлов из родительского каталога(C:\INF\) и всех дочерних каталогов
например в C:\Log.txt чтобы получилос что-то похожее на
c:\inf\kil.doc
c:\inf\atf.exe
c:\inf\exe\bpx.exe
...........................
c:\inf\..................
Заранее спасибо
← →
Плохиш © (2005-11-02 01:02) [1]AssignFile/Rewrite/Write(ln)/CloseFile - работа с текстовыми файлами
FindFirst/FindNext + рекурсия - поиск файлов/каталогов в заданном каталоге
Книжки по программированию/встроенная справка - теория программирования
← →
KorvinOE © (2005-11-02 09:52) [2]С помощью FindFirst/FindNext находишь по порядку все объекты в папке и определяешь папка это или файл. Если файл то сохраняешь его адрес, а если каталог - выполняешь эту же ф-цию для этого каталога :)
← →
Cvin (2005-11-02 14:52) [3]
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;
← →
Cvin (2005-11-02 15:56) [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;
← →
wp2 © (2005-11-02 20:26) [5]
> Суть в том что в определенном каталоке (C:\INF) существуют
> подкаталоги в них еще подкаталоги............... в каждом
> каталоге также имеются и файлы.
> как можно записать адреса всех файлов из родительского каталога(C:
> \INF\) и всех дочерних каталогов
> например в C:\Log.txt чтобы получилос что-то похожее на
Вы бы сперва выучили такое понятие как рекурсия...
← →
Freeon © (2005-11-02 22:42) [6]Всем спасибо, сам пробовал,у меня получилось так
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-03 21:47) [7]
> to wp2 из моего кода видно - я знаю, что такое рекурсия
Так чё тогда спрашиваешь?
Страницы: 1 вся ветка
Текущий архив: 2006.01.08;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c