Как получить информацию о диреториях.

  • Автор темы Pelafustan
  • Дата начала
P

Pelafustan

Здравствуйте! подскажите функцию или алгоритм, путем которого можно получить информацию о каталогах и подкаталогах, содержащихся на указанном диске.
задача следующая: необходимо поочереди получать имена каталогов и записывать их в переменную типа char*, после проведения некоторых действий - перезаписывать char* именем следующей директории
 
E

European

FindFirstFile + GetFileAttributes с флагом FILE_ATTRIBUTE_DIRECTORY
 
P

Pelafustan

Я конечно извиняюсь за наглость, а можете код этой процедуры написать?
 
E

European

я - нет... если бы привели свой код, рассказали, что не получается, можно было помочь
 
P

Pelafustan

Спасибо, я уже разобрался. Если кому то интересно вот код
BOOL SearchFiles(
LPCTSTR lpszFileName, // Директория и маска файлов для поиска
LPSEARCHFUNC lpSearchFunc, // Функция, вызываемая для всех найденных файлов.
BOOL bInnerFolders /* = TRUE */) // TRUE - поиск в подпапках.
// FALSE - поиск только в заданной папке


typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);

BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
LPTSTR part;
char tmp[MAX_PATH]; // временный массив
char name[MAX_PATH];

HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

// сначало поиск внутри вложенных папках ...
if(bInnerFolders)
{
if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
strcpy(name, part);
strcpy(part, "*.*");

// если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
// в каждой папке есть две папки с именами "." и ".."
// и эти папки мы не трогаем

// пропускаем папки "." и ".."
if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))
continue;

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
{
char next[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);
strcat(next, "\\");
strcat(next, name);

SearchFiles(next, lpSearchFunc, TRUE);
}
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

FindClose (hSearch); // заканчиваем поиск
}

if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)
return TRUE; // в противном случае выходим
do
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
{
char file[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);

lpSearchFunc(file);
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск

return TRUE;
}


Поиск всех файлов с расширением txt в папке "C:\Dir1" и вложенных в нее папках.

SearchFiles("C:\Dir1\*.txt", DoSomething, TRUE);

Поиск всех файлов с именем name и любым расширением только в папке "C:\Dir1"

SearchFiles("C:\Dir1\name.*", DoSomething, FALSE);
 
G

grigsoft

Пропустит папки типа ".Folder". Размера стека может и не хватить для глубокой вложенности.

Ну и кстати, пути уже давно могут MAX_PATH превышать.
 
G

grigsoft

Ну что - если это учебное задание, то просто принять замечания к сведению, сдать и забыть. Если есть желание довести код до ума, то по пунктам:
1. проверка на .\.. - по полному совпадению, а не на начало
2. Вместо рекурсии - стек каталогов.
3. Вместо двойного обхода каталоги + файлы: один обход с самостоятельной проверкой на совпадение фильтра. Это поможет и когда надо будет искать "* txt; *.doc".
Грубо говоря так:
Код:
корневой каталог -> стек
пока стек не пуст
ищем файлы в каталоге из стека:
нашли файл - проверяем подходит ли он по маске и обрабатываем
нашли каталог - в стек его.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!