Подтвердить что ты не робот

Как искать на компьютере файлы и папки

Мне нужен способ поиска на компьютере файлов, таких как Windows Explorer. Я хочу, чтобы моя программа для поиска, скажем, жесткий диск C :. Мне нужно, чтобы он искал в C:\папки и файлы (только те, которые вы могли видеть в c: \, тогда, если пользователь щелкает файл в списке, например, папка test (C:\test), он выполняет поиск test и позволяет пользователь видит, какие файлы/папки находятся в нем.

4b9b3361

Ответ 1

Поскольку вы упоминали о Windows, самый простой способ сделать это с помощью функций FindFirstFile и FindNextFile.

редактировать: вот пример, который показывает, как перечислить все файлы/папки в каталоге.

#include <Windows.h>
#include <iostream>


int main()
{
    WIN32_FIND_DATA file;
    HANDLE search_handle=FindFirstFile(L"C:\\*",&file);
    if (search_handle)
    {
        do
        {
            std::wcout << file.cFileName << std::endl;
        }while(FindNextFile(search_handle,&file));
        FindClose(search_handle);

    }

}

Ответ 2

Это будет зависеть от ОС. ТАК вопрос

Как я могу получить список файлов в каталоге, используя C или C++?

хорошо справляется с этой проблемой. Вы можете скачать DIRENT здесь.

Теперь, когда у вас это есть, я бы рекомендовал рекурсивно искать файл с помощью алгоритма DFS/BFS. Можно предположить, что вся структура каталогов представляет собой дерево, где каждый файл является листовым узлом, а каждый подкаталог - внутренним узлом.

Так что все, что вам нужно сделать, это

  1. Получить список файлов/папок в каталоге с функцией, такой как:
    void getFilesFolders(vector<string> & dir_list, const string & folder_name)
  2. Если это каталог, перейдите к 1 с именем каталога
  3. Если это файл, прекратите, если это файл, который вы ищете, иначе перейдите к следующему файлу.

Ответ 3

Вы можете использовать члены класса Directory, чтобы сделать это с С# или управляемым C++. Смотрите следующую статью MSDN:

http://support.microsoft.com/kb/307009

Если вы хотите использовать C++ с MFC, вы можете использовать CFileFind

http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx

Вы должны будете предоставить свое собственное окно просмотра, чтобы представить дерево файловой системы.

Или вы можете использовать один из элементов управления каталогом/файлом, чтобы сделать оба для вас.

Ответ 4

boost :: filesystem может быть кроссплатформенным решением для этого (посмотрите на такие функции в нем).

Ответ 5

 #include <Windows.h>
#include <iostream>


int FindF(char* pDirectory)
{
    char szFindPath[MAX_PATH] = {0};
    strcpy(szFindPath, pDirectory);
    strcat(szFindPath, "\\*");
    WIN32_FIND_DATA file;
    HANDLE search_handle=FindFirstFile(szFindPath,&file);
    if (search_handle)
    {
        do
        {
            if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
            {
              strcpy(szFindPath, pDirectory);
              strcat(szFindPath, "\\");
              strcat(szFindPath, file.cFileName);
              FindF(szFindPath);
            }
            std::wcout << file.cFileName << std::endl;
        }while(FindNextFile(search_handle,&file));
        CloseHandle(search_handle);

    }

}

Ответ 6

Для этого не нужно использовать стороннюю библиотеку. Это короткая независимая функция, которая перечисляет все файлы (с их путями) в каталоге, включая файлы подкаталогов. std::string folderName должен заканчиваться на \, и если вы хотите перечислить все файлы на компьютере, просто создайте цикл в вызывающей функции вместе с GetLogicalDriveStrings (он возвращает строки с \, поэтому он не может в этом случае удобнее).

void FindAllFiles(std::string folderName)
{
    WIN32_FIND_DATA FileData;
    std::string folderNameWithSt = folderName + "*";
    HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData);

    if (FirstFile != INVALID_HANDLE_VALUE) {
        do {
            if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0)
            {
                if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    std::string NewPath = folderName + FileData.cFileName;
                    NewPath = NewPath + "\\";

                    FindAllFiles(NewPath);
                }
                else
                {
                    std::cout /*<< folderName*/ << FileData.cFileName << std::endl;
                }
            }
        } while(FindNextFile(FirstFile, &FileData));
    }
}

Это версия ASCII, помните, что файлы и папки могут быть названы в Unicode