使用c++17遍历文件
在c++17之前我们遍历一个文件夹folder ,代码大概是下边这个样子的。
void find_all_files(string folder, vector<string>& vFiles)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
snprintf(szFind, sizeof(szFind), "%s\\*.*", folder.c_str());
HANDLE hFind = ::FindFirstFile(szFind, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind) return;
for (;;)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindFileData.cFileName[0] != '.')
{
snprintf(szFind, sizeof(szFind), "%s\\%s", folder.c_str(), FindFileData.cFileName);
find_all_files(szFind, vFiles);
}
}
else
{
snprintf(szFind, sizeof(szFind), "%s\\%s", folder.c_str(), FindFileData.cFileName);
vFiles.push_back(szFind);
}
if (!FindNextFile(hFind, &FindFileData)) break;
}
FindClose(hFind);
}
c++17中推出了filesystem ,于是遍历文件仅仅下边一行代码就够了,使用filesystem 时,需要的头文件为#include <filesystem>
#include <filesystem>
void find_all_files(string folder)
{
namespace fs = std::filesystem;
for(auto const& dir_entry: fs::recursive_directory_iterator{folder})
{
if(!dir_entry.is_directory())
{
printf("%s\n", dir_entry.path().string().c_str());
}
}
}
filesystem中还有哪些好用的玩意儿
filesystem::path
filesystem::copy
filesystem::copy_file
filesystem::current_path
filesystem::exists
filesystem::file_size
filesystem::remove
filesystem::rename
filesystem::space
filesystem::is_directory
filesystem::is_empty
上边只是几个例子,点击此处可查看完整接口
FAQ
有的朋友在使用filesystem 的时候,发现编译不过,找不到声明。这大概率时没有使用c++17或者以上标准的库引起的。因为这个library时c++17开始引入的,如果使用之前的版本自然编译不过。
所以,如果您使用的时CMake ,那么就要在CMakeLists.txt中添加以下代码,
set(CMAKE_CXX_STANDARD 17)
如果使用的时visual studio则需要按照以下方式设置,
|