Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.013 c
14-1134497873
Yerlan Dossanov
2005-12-13 21:17
2006.01.08
Объект или субъект


2-1135084675
Bart27
2005-12-20 16:17
2006.01.08
Как такое осуществить?


14-1134270358
Думкин(_врем)
2005-12-11 06:05
2006.01.08
МВо, с Днем рождения!


2-1135089991
Asail
2005-12-20 17:46
2006.01.08
Проблемма с IIS и ISAPI dll...


2-1134935383
x-steff
2005-12-18 22:49
2006.01.08
Проблема с БД в Дельфи