Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с прохожднием всех каталогов   Найти похожие ветки 

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
14-1134536105
begin...end
2005-12-14 07:55
2006.01.08
С Днём рождения! 14 декабря


1-1134022139
Dima_DD
2005-12-08 09:08
2006.01.08
Ролик мышки на DBGrid


14-1134573036
lookin
2005-12-14 18:10
2006.01.08
Вес электрона


4-1130840334
BFG9k
2005-11-01 13:18
2006.01.08
Передача настроек принтера


6-1127725974
vishnya
2005-09-26 13:12
2006.01.08
Электронная цифровая подпись для писем





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский