program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows;
procedure findfiles(dir:string);
var fd:WIN32_FIND_DATA;
hFindFile:DWORD;
begin
hFindFile:=FindFirstFile(pchar(dir+'*.*'),fd);
if hFindFile<>INVALID_HANDLE_VALUE then
repeat
if fd.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY then
begin
if (string(fd.cFileName)<>'.') and (string(fd.cFileName)<>'..') then
findfiles(dir+fd.cFileName+'\')
end
else
writeln(dir+fd.cFileName);
until FindNextFile(hFindFile,fd)=false;
FindClose(hFindFile);
end;
begin
findfiles('c:\windows\');
readln;
end.
Перечисление файлов и папок
Столкнулся с такой проблемой: надобно создать список папок, вложеннных папок, файло, etc. Подскажите, как это сделать?
FindFirstFile, FindNextFile, и рекурсивный перебор :о)
Расскажи поподробнее о рекурсивном переборе плз...:rolleyes:
Код:
программа выведет в консоль все файлы лежащие в c:\windows\. впринципе саму процедуру findfiles будет не так уж и сложно переделать на нужный тебе язык.
Код:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
void Find(string path)
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
string _path, s_path;
_path = path+ "\\" + "*";
hSearch = FindFirstFile(_path.c_str(), &FileData);
while(FindNextFile(hSearch, &FileData))
{
if(strcmp(FileData.cFileName, ".") == 0) continue;
if(strcmp(FileData.cFileName, "..") == 0) continue;
s_path = path + "\\" + FileData.cFileName;
if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
cout << s_path.c_str() << endl;
else
{
cout << "<DIR> " << s_path.c_str() << endl;
Find(s_path); // рекурсия, передаем другие параметры
}
s_path.clear();
}
FindClose(hSearch);
}
int main()
{
Find("C:");
getchar();
return 0;
}
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
void Find(string path)
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
string _path, s_path;
_path = path+ "\\" + "*";
hSearch = FindFirstFile(_path.c_str(), &FileData);
while(FindNextFile(hSearch, &FileData))
{
if(strcmp(FileData.cFileName, ".") == 0) continue;
if(strcmp(FileData.cFileName, "..") == 0) continue;
s_path = path + "\\" + FileData.cFileName;
if(!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
cout << s_path.c_str() << endl;
else
{
cout << "<DIR> " << s_path.c_str() << endl;
Find(s_path); // рекурсия, передаем другие параметры
}
s_path.clear();
}
FindClose(hSearch);
}
int main()
{
Find("C:");
getchar();
return 0;
}
Цитата: kosfiz
Код:
.....
if fd.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY then
begin
if (string(fd.cFileName)<>'.') and (string(fd.cFileName)<>'..') then
findfiles(dir+fd.cFileName+'\')
end
......
if fd.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY then
begin
if (string(fd.cFileName)<>'.') and (string(fd.cFileName)<>'..') then
findfiles(dir+fd.cFileName+'\')
end
......
Надо вот так:
Код:
.....
if (((fd.dwFileAttributes) and(FILE_ATTRIBUTE_DIRECTORY))=FILE_ATTRIBUTE_DIRECTORY ) then
begin
if (string(fd.cFileName)='.') or (string(fd.cFileName)='..') then continue;
findfiles(dir+fd.cFileName+'\')
end
......
if (((fd.dwFileAttributes) and(FILE_ATTRIBUTE_DIRECTORY))=FILE_ATTRIBUTE_DIRECTORY ) then
begin
if (string(fd.cFileName)='.') or (string(fd.cFileName)='..') then continue;
findfiles(dir+fd.cFileName+'\')
end
......
Да, с файлами все понятно. Но как перечислить и вложеннные папки?
Цитата: insane88
Да, с файлами все понятно. Но как перечислить и вложеннные папки?
А я тебе че написал?
Извини, я вбшник, сразу в коде не разобрался...:rolleyes:
Народ, а почему в конце найденных имен тучи квадратов?
Немного модифицированный код предыдущего аттача
какие квадраты, блин? :о) у меня тот же самый код на C++ работает на ура :о)
То Си... в конце имен файлов нуллчары. Удалить-то я их удалил, но поиск все равно не желает работать.