К сожалению, стандарт 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
#include #include 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.
Вы должны просто вызвать его как статический метод:
IPAddressExtensions::GetSubnetMask(address);
Метод «расширения» - это скорее уловка компилятора, чем разница в CLR.