findnextfile



Автор Анна Иевлева задал вопрос в разделе Другие языки и технологии

Как перебрать все каталоги в текущей директории? (на WinAPI) и получил лучший ответ

Ответ от Viktor_gugo[гуру]
может FindFirstFile и FindNextFile

Ответ от Nikita Didenko[эксперт]
FindNextFile

Ответ от Алексей[мастер]
procedure GetTreeDirs(Root: string; OutPaper: TStringList);
var
i: Integer;
s: string;
procedure InsDirs(s: string; ind: Integer; Path: string; OPaper: TStringList);
var {Вставляет в Memo список вложенных директорий}
sr: TSearchRec;
attr: Integer;
begin
attr := 0;
attr := faAnyFile;
if DirectoryExists(Path) then
if FindFirst(IncludeTrailingBackslash(Path) + '*.*', attr, SR) = 0 then
begin
repeat
if (sr.Attr = faDirectory) and (sr.Name[Length(sr.Name)] <> '.') then
OPaper.Insert(ind, s + sr.Name);
until (FindNext(sr) <> 0);
FindClose(SR);
end
end;
begin
{Проверяем существуетли начальный каталог}
if not DirectoryExists(Root) then
exit;
{Создаем список каталогов первой вложенности}
if root[Length(Root)] <> '' then
InsDirs(root + '', OutPaper.Count, Root, OutPaper)
else
InsDirs(root, OutPaper.Count, Root, OutPaper);
i := 0;
repeat
s := OutPaper; //в s получаем путь к уже внесенному в список кат.
// Вставляем сразу за данной директорией в списке,
// список вложенных в нее директорий.
// Тем самым увеличиваем OutPaper.Lines.Count.
// Таким образом катологи в которых поиск еще не производился,
// оказываются ниже и очереь до них еще дойдет.
InsDirs(s + '', i + 1, OutPaper, OutPaper);
inc(i);
until (i = OutPaper.Count);
end;
Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
var
Strs: TStringList;
begin
Strs := TStringList.Create;
try
GetTreeDirs('C:', Strs);
FillTreeViewWithFiles(TreeView1, Strs);
finally
Strs.Free;
end;
end;

Ответ от V/lodia[гуру]
Быстро ответил однако.

Ответ от Пользователь удален[гуру]
FindNextFile здесь попробуй!

Ответ от DarkLostSoul[гуру]
Еще можно как то через командную строку (через system(...)) Там получается текстовый файл со списком всех файлов и программ. Для него правда придется писать интерпритатор... но имхо это способ через жопу, не не совсем по ВинАПИ) )
Так что лучше через FindNextFile.

Ответ от ??? ?????????[гуру]
HRESULT WINAPI KeepDirectory(LPTSTR lpDirectory, LPVOID pContext)
{
// TODO :
return 0;
}
HRESULT WINAPI FindDirectory(LPTSTR lpPath, BOOL bRecursive, HRESULT (WINAPI *p)(LPTSTR, LPVOID), LPVOID pContext)
{
HRESULT hRet = E_FAIL;
int n = lstrlen(lpPath);
lstrcpy(&lpPath[n++], _T("*.*"));
WIN32_FIND_DATA fd;
HANDLE hf = FindFirstFile(lpPath, &fd);
if (hf != INVALID_HANDLE_VALUE)
{
do
{
lstrcpy(&lpPath[n], fd.cFileName);
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (lstrcmp(fd.cFileName, _T(".")) && lstrcmp(fd.cFileName, _T("..")))
{
// Is Directory
p(lpPath, pContext);
if (bRecursive)
{
FindDirectory(lpPath, bRecursive, p, pContext);
}
}
}
else
{
// TODO: is File
}
} while (FindNextFile(hf, &fd));
FindClose(hf);
hRet = S_OK;
}
lpPath[--n] = 0;
return hRet;
}
void main()
{
TCHAR szPath[MAX_PATH];
lstrcpy(szPath, _T("C:Path"));
FindDirectory(szPath, TRUE, KeepDirectory, NULL);
}

Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Как перебрать все каталоги в текущей директории? (на WinAPI)
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*