我需要在C ++目录中生成一个文件名容器,它必须是跨平台兼容的。有人建议使用WIN32_FIND_DATA
数据结构。这是最好的选择,如果是这样,我将如何实现它?
用户不会输入文件名,而是C ++函数会自动搜索目录并创建文件名容器。我不知道怎么读这样的文件名。
我也非常关注标准,因此<dirent.h>
不是理想的解决方案,因为它不是ISO C标准,即使它是C POSIX库中的标题。
答案 0 :(得分:3)
我猜测WIN32_FIND_DATA不是跨平台的最佳选择,但有可能帮助在Linux上提供它。
考虑使用boost filesystem将文件转储到std::vector
。
这样的事情(改编自here):
void show_files(const path & directory)
{
if(!exists(directory)) return;
directory_iterator end ;
for( directory_iterator iter(directory) ; iter != end ; ++iter )
if (is_directory(*iter)) continue; // skip directories
cout << "File: " << iter->native_file_string() << "\n" ;
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
列出目录内容的跨平台方式是:
Boost Filesystem Library(尤其是directory_iterator
,允许您列出目录的内容);
C标准库 POSIX标准标题<dirent.h>
。
另一方面,WIN32_FIND_DATA
几乎肯定不能在不同平台上移植(从名称来看)。
答案 3 :(得分:0)
我会使用Boost.FileSystem。未测试的:
#include "boost/filesystem.hpp"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
namespace bf = boost::filesystem;
typedef std::vector<bf::path> path_container;
path_container enumerate_files(const bf::path& pDirectory)
{
path_container result;
if (!bf::exists(pDirectory))
return result;
bf::directory_iterator iter(pDirectory);
bf::directory_iterator last;
for (; iter != last; ++iter)
if (bf::is_regular_file(iter->status()))
result.push_back(iter->path());
return result;
}
int main(void)
{
path_container c = enumerate_files("./");
std::copy(c.begin(), c.end(),
std::ostream_iterator<bf::path>(std::cout, "\n"));
}