Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться с прохожднием всех каталогов [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 + рекурсия - поиск файлов/каталогов в заданном каталоге
Книжки по программированию/встроенная справка - теория программирования


Наверх

Титульная страница Поиск, карта сайта Написать письмо