创建一个包含目录中文件名的C ++容器

时间:2010-06-24 19:05:43

标签: c++ directory containers filenames

我需要在C ++目录中生成一个文件名容器,它必须是跨平台兼容的。有人建议使用WIN32_FIND_DATA数据结构。这是最好的选择,如果是这样,我将如何实现它?

用户不会输入文件名,而是C ++函数会自动搜索目录并创建文件名容器。我不知道怎么读这样的文件名。

我也非常关注标准,因此<dirent.h>不是理想的解决方案,因为它不是ISO C标准,即使它是C POSIX库中的标题。

4 个答案:

答案 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)

嗯,我认为Win32的任何东西都不是跨平台的。如果你只需要存储目录名,你不能只使用数组或向量吗?

答案 2 :(得分:0)

列出目录内容的跨平台方式是:

另一方面,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"));
}