【发布时间】:2011-06-29 22:16:03
【问题描述】:
我想在 C++ 目录中列出文件夹,理想情况下以可移植(在主要操作系统中工作)的方式。我尝试使用 POSIX,它可以正常工作,但我如何确定找到的项目是否是文件夹?
【问题讨论】:
我想在 C++ 目录中列出文件夹,理想情况下以可移植(在主要操作系统中工作)的方式。我尝试使用 POSIX,它可以正常工作,但我如何确定找到的项目是否是文件夹?
【问题讨论】:
您可以使用opendir() 和readdir() 列出目录和子目录。以下示例打印当前路径内的所有子目录:
#include <dirent.h>
#include <stdio.h>
int main()
{
const char* PATH = ".";
DIR *dir = opendir(PATH);
struct dirent *entry = readdir(dir);
while (entry != NULL)
{
if (entry->d_type == DT_DIR)
printf("%s\n", entry->d_name);
entry = readdir(dir);
}
closedir(dir);
return 0;
}
【讨论】:
使用 C++17 std::filesystem 库:
std::vector<std::string> get_directories(const std::string& s)
{
std::vector<std::string> r;
for(auto& p : std::filesystem::recursive_directory_iterator(s))
if (p.is_directory())
r.push_back(p.path().string());
return r;
}
【讨论】:
p.status().type() == std::filesystem::file_type::directory 可以替换为p.is_directory(),除非有我不知道的细微差别。
下面是来自boost filesystem documentation 的(稍作修改)引用,向您展示如何做到这一点:
void iterate_over_directories( const path & dir_path ) // in this directory,
{
if ( exists( dir_path ) )
{
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()) )
{
//... here you have a directory
}
}
}
}
【讨论】:
boost::filesystem 需要构建。它不仅仅是标题。
查找stat 函数。 Here 是一个描述。一些示例代码:
struct stat st;
const char *dirname = "dir_name";
if( stat( dirname, &st ) == 0 && S_ISDIR( st.st_mode ) ) {
// "dir_name" is a subdirectory of the current directory
} else {
// "dir_name" doesn't exist or isn't a directory
}
【讨论】:
我不得不提及PhysFS。我只是将它集成到我自己的项目中。它提供真正的跨平台(Mac/Linux/PC)文件操作,甚至可以解压各种压缩包定义,如zip、7zip、pak等。它有一些函数(PHYSFS_isDirectory、PHYSFS_enumerateFiles)也可以确定您的要求。
【讨论】: