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

Тема в разделе "MS Visual C++", создана пользователем Pelafustan, 4 авг 2008.

  1. Pelafustan

    Pelafustan Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    FindFirstFile + GetFileAttributes с флагом FILE_ATTRIBUTE_DIRECTORY
     
  3. Pelafustan

    Pelafustan Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    я - нет... если бы привели свой код, рассказали, что не получается, можно было помочь
     
  5. Pelafustan

    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);
     
  6. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Пропустит папки типа ".Folder". Размера стека может и не хватить для глубокой вложенности.

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

    Pelafustan Гость

    Что посоветуете?
     
  8. grigsoft

    grigsoft Well-Known Member

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

    Pelafustan Гость

    Спасибо всем за помощь!
     
Загрузка...

Поделиться этой страницей