Как получить весь путь к файлу с диска C:/?

#c #visual-studio #filesystems

Вопрос:

Я пытаюсь извлечь все файлы из корневого каталога (C:/) на C

Прежде всего, я извлекаю все логические диски на компьютере, затем я использую библиотеку файловой системы std:: (в частности, функцию recursive_directory_iterator для циклического поиска в каталогах)

     DWORD dwSize = MAX_PATH;
    char szLogicalDrives[MAX_PATH] = { 0 };
    DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives);

    if (dwResult > 0 amp;amp; dwResult <= MAX_PATH)
    {
        char* szSingleDrive = szLogicalDrives;
        while (*szSingleDrive)
        {
            szSingleDrive[strlen(szSingleDrive) - 1] = 0;
            printf(szSingleDrive);
            for (fs::directory_entry p : std::filesystem::recursive_directory_iterator(szSingleDrive))
            {

                string filePath = p.path().string();
                // Vérification du type de l'objet
                if (fs::is_regular_file(p.path()))
                {

                    cout << filePath << endl;


                }

            // get the next drive
            szSingleDrive  = strlen(szSingleDrive)   1;
        }
      }
    }
 

Однако результат, который я получаю, — это путь моего проекта.
Например : C:x64DebugmyProject.exe

Желаемый результат : C:Users, C:Windows, C:Program Файлы…

Комментарии:

1. Спросите себя, что делает эта строка ( szSingleDrive[strlen(szSingleDrive) - 1] = 0; ) и почему она существует.

2. Послесловие К: не для украшения. Кроме того, почему вы сравниваете bool с std::string::npos ?

3. if (fs::is_regular_file(p.path()) == string::npos) должно быть if (fs::is_regular_file(p.path())) или проще if (p.is_regular_file())

4. @RemyLebeau, да, я виноват, я отредактировал код STF перед публикацией, чтобы удалить ненужную информацию. Эта строка была для : if (fs::is_regular_file(p.путь()) amp;amp; Путь к файлу.найти(кроме пути.строка()) == строка::npo) , где кроме пути = C:\Windows, чтобы исключить этот путь

5. @Botje да, я попытался с «C:\», но файловая система выдала ошибку : Необработанное исключение в 0x00007FFBE0384ED9 в program.exe: Исключение Microsoft C : std::файловая система::ошибка файловой системы в ячейке памяти 0x000000AE6953F1F0. Вы когда-нибудь пытались запустить функцию recusive_driectory в корневом пути ?

Ответ №1:

Чтобы решить проблему, мне пришлось запустить VS 2019 в администраторе (или запустить .exe в администраторе) отключить защитник Windows.

Чтобы избежать исключения UAC, я также добавил skip_permission_denied опцию «Файловая система».

Однако моя программа все еще сталкивается "Sharing Violation error"