Помощь - Поиск - Пользователи - Календарь
Полная версия: Поиск в папке и ее подпапках
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Apache
Здравствуйте всем доброго времени суток. Я вот только начал изучать С++ и у меня есть вопросик. Как реализовать поиск в папке и ее подпапках?
{
WIN32_FIND_DATA FindFileData;
HANDLE hf;
hf=FindFirstFile("c:\\test\\*.txt", &FindFileData);
if (hf!=INVALID_HANDLE_VALUE)
{
do
{
cout << FindFileData.cFileName << endl;
}

Я на правильном пути? smile.gif
volvo
Цитата
Я на правильном пути?
Во первых это не С++, а чистый С, во вторых, для решения твоей задачи придется выносить поиск в функцию, и вызывать ее рекурсивно...

В общем,
#include <windows.h>
#include <stdio.h>

BOOL SearchFiles(LPCTSTR lpszFileName, 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, 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);

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

    return TRUE;
}

int main()
{
    SearchFiles("G:\\Received\\*.txt", TRUE);
    return 0;
}

(С) Лепрекон, с моей незначительной правкой.
Apache
volvo cпасибо как всегда помог good.gif . Теперь вопросик как при помощи этой функции копировать/удалять найденные файлы? unsure.gif
volvo
Цитата
как при помощи этой функции копировать/удалять найденные файлы?
Пропиши нужные тебе действия вместо printf... ( для удаления: DeleteFile, для копирования/перемещения: CopyFile / MoveFile )
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.