1

编辑:我使用的是 std::tr2::sys 而不是 boost 的文件系统

我正在开发一个简单的应用程序,它可以扫描计算机上的目录并返回有关这些文件的统计信息。可以通过两种方式调用扫描:递归和非递归。将路径与是否应递归执行扫描的标志一起传递给扫描方法。鉴于这path folder两个实现看起来像这样:

directory_iterator start( folder ), end;
for( ; start != end; ++start ) {
    //Some code in here
    // get the path like this:
    auto path = start->path();
}

或者

recursive_directory_iterator start( folder ), end;
for( ; start != end; ++start ) {
    //Some code in here
    // get the path like this:
    auto path = start->path();
}

我遇到的问题是,在使用常规 directory_iterator 的块中,当我尝试获取路径时,它只会返回文件名,即。“myTextFile.txt” 从 recursive_directory_iterator 获取它会返回系统上文件的完整路径。在每种情况下,文件夹的值都是相同的(也是完整的文件路径)。路径的前半部分被截断是有原因的,还是有什么方法可以从我从 directory_iterator 返回的缩写路径中获取完整的文件路径?

4

2 回答 2

2

对于完整路径,您需要使用start->path().directory_string()

directory_iterator end;
for (directory_iterator start(p);
      start != end;
      ++start)
{
    if (is_directory(start->status()))
    {
      //A directory
    }
    if (is_regular_file(start->status()))
    {   
      std::cout << start->path().directory_string()<< "\n";
    }
}

根据您的需要进行以下操作,请参阅 boost 文档以获取更多详细信息,但名称建议全部。

start->path().branch_path();
start->path().directory_string();
start->path().file_string();
start->path().root_path();
start->path().parent_path();
start->path().string();
start->path().basename();
start->path().filename();
start->path().root_name();
start->path().relative_path();
于 2013-08-09T13:38:38.350 回答
1

使用完整的功能:

auto full_path = std::tr2::sys::complete(path, folder);

另一种简单的方法是简单地将文件名附加到路径(在 MSVC2012 上使用命名空间<filesystem>中的测试std::tr2::sys):

for (; start != end; ++start) {
    auto path = start->path();
    auto full_path = folder / path;
}
于 2013-08-09T13:49:51.547 回答