Вам нужно использовать this
- и большинство людей используют его только при наличии локальной локальной переменной с таким же именем. (Например, методы сеттера.)
Конечно, еще одна веская причина использовать this
в том, что она вызывает всплытие intellisense в IDE:)
В маленьких и простых задачах я не использую повышение, я использую 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;
}
К сожалению, стандарт 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.
Попробуйте повышение за метод x-платформы
http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm
или просто используйте Вашу ОС определенный материал файла.
Здание, что отправленный 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;
}