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

Вам нужно использовать this - и большинство людей используют его только при наличии локальной локальной переменной с таким же именем. (Например, методы сеттера.)

Конечно, еще одна веская причина использовать this в том, что она вызывает всплытие intellisense в IDE:)

530
задан samoz 7 October 2018 в 01:59
поделиться

4 ответа

В маленьких и простых задачах я не использую повышение, я использую dirent.h, который также доступен для окон:

DIR *dir;
struct dirent *ent;
if ((dir = opendir ("c:\\src\\")) != NULL) {
  /* print all the files and directories within directory */
  while ((ent = readdir (dir)) != NULL) {
    printf ("%s\n", ent->d_name);
  }
  closedir (dir);
} else {
  /* could not open directory */
  perror ("");
  return EXIT_FAILURE;
}

Это - просто маленький заголовочный файл и делает большую часть простого материала, в котором Вы нуждаетесь, не используя большой основанный на шаблоне подход как повышение (никакое преступление, мне нравится повышение!).

автором слоя совместимости окон является Toni Ronkko. В Unix это - стандартный заголовок.

ОБНОВЛЕНИЕ 2017 :

В C++ 17 существует теперь официальный способ перечислить файлы Вашей файловой системы: std::filesystem. Существует превосходный ответ от Shreevardhan ниже с этим исходным кодом:

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}
733
ответ дан jhpratt 7 October 2018 в 11:59
поделиться

К сожалению, стандарт C++ не определяет стандартный способ работать с файлами и папками таким образом.

С тех пор нет никакого кросс-платформенного пути, лучший кросс-платформенный путь состоит в том, чтобы пользоваться библиотекой такой как модуль файловой системы повышения .

Кросс-платформенный метод повышения:

следующая функция, учитывая путь к каталогу и имя файла, рекурсивно ищет каталог и его подкаталоги для имени файла, возвращая bool, и, если успешный, путь к файлу, который был найден.

bool find_file(const path & dir_path,         // in this directory,
               const std::string & file_name, // search for this name,
               path & path_found)             // placing path here if found
{
    if (!exists(dir_path)) 
        return false;

    directory_iterator end_itr; // default construction yields past-the-end

    for (directory_iterator itr(dir_path); itr != end_itr; ++itr)
    {
        if (is_directory(itr->status()))
        {
            if (find_file(itr->path(), file_name, path_found)) 
                return true;
        }
        else if (itr->leaf() == file_name) // see below
        {
            path_found = itr->path();
            return true;
        }
    }
    return false;
}

Источник от страницы повышения упомянут выше.

Для основанных на Unix/Linux систем:

можно использовать opendir / readdir / closedir.

Пример кода, который ищет каталог запись ''имя'':

len = strlen(name);
dirp = opendir(".");
while ((dp = readdir(dirp)) != NULL)
        if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
                (void)closedir(dirp);
                return FOUND;
        }
(void)closedir(dirp);
return NOT_FOUND;

Исходный код из вышеупомянутых страниц справочника.

Для основанные на окнах системы:

можно использовать Win32 API FindFirstFile / FindNextFile / функции FindClose.

следующий пример C++ показывает Вам минимальное использование FindFirstFile.

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFile(argv[1], &FindFileData);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFile failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

Исходный код от вышеупомянутых страниц MSDN.

223
ответ дан John Kugelman 7 October 2018 в 11:59
поделиться

Попробуйте повышение за метод x-платформы

http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm

или просто используйте Вашу ОС определенный материал файла.

10
ответ дан Tim 7 October 2018 в 11:59
поделиться
  • 1
    Извините за большую задержку. Относительно № 1 я don' t имеют activatorconfig.txt. Я даже искал свой диск C его. Однако относительно № 2 это работало! Я могу наконец отладить. Огромное спасибо! – abourg28 5 December 2013 в 04:28

Здание, что отправленный herohuyongtao и несколько других сообщений:

http://www.cplusplus.com/forum/general/39766/

, Что ожидаемым является входной тип FindFirstFile?

, Как преобразовать wstring в строку?

Это - решение для Windows.

, Так как я хотел передать в станд.:: представьте в виде строки и возвратите вектор строк, я должен был сделать пару преобразований.

#include <string>
#include <Windows.h>
#include <vector>
#include <locale>
#include <codecvt>

std::vector<std::string> listFilesInDir(std::string path)
{
    std::vector<std::string> names;
    //Convert string to wstring
    std::wstring search_path = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(path);
    WIN32_FIND_DATA fd;
    HANDLE hFind = FindFirstFile(search_path.c_str(), &fd);
    if (hFind != INVALID_HANDLE_VALUE) 
    {
        do 
        {
            // read all (real) files in current folder
            // , delete '!' read other 2 default folder . and ..
            if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
            {
                //convert from wide char to narrow char array
                char ch[260];
                char DefChar = ' ';
                WideCharToMultiByte(CP_ACP, 0, fd.cFileName, -1, ch, 260, &DefChar, NULL);
                names.push_back(ch);
            }
        } 
        while (::FindNextFile(hFind, &fd));
        ::FindClose(hFind);
    }
    return names;
}
0
ответ дан 22 November 2019 в 22:20
поделиться