如何枚举vfs c或c ++中目录中的所有文件?

时间:2013-02-13 16:49:47

标签: c++ c linux unix vfs

我需要枚举文件夹中的所有文件,然后导航到子文件夹并执行相同的操作(递归?确定)。

理想情况下,算法应该在linux和Linux上以相同的方式工作。的MacOS

免责声明:我在POSIX上问了一个类似的问题:我现在知道VFS,但我很困惑使用VFS来枚举dir。有什么建议吗?我应该打开dir作为文件吗?唯一的方法是使用像qt?

这样的库交叉平台

更新:所以没有 VFS 方式在目录上工作? “* V * irtual * F * ile * S * ystem提供单个API以访问各种不同的文件系统”但无法枚举目录。

“readdir”等解决方案可以解决任何类型的* NIX问题吗?在Windows上没有比巨大的MingW lib更好的了吗?或部分实施只工作一些胜利:  https://github.com/xbmc/xbmc/blob/master/tools/TexturePacker/Win32/dirent.c

BOOST似乎是一个非常酷的解决方案,但它复杂且具有学术性。无论如何都是

最后更新
我找到了更多的文档,现在一切都更加清晰。 这个问题是重复的! opendir()和readdir()是枚举和浏览linux目录的解决方案。如我的例子所示很容易在windows上映射它们(但是不一致的windowz fs会让一切变得奇怪)而且ntfw()更有用。

VFS (虚拟文件交换机)是一种内核功能,它通过为文件系统操作创建抽象层来解决此问题。已关闭的文档:linux programming interface

thnks!

3 个答案:

答案 0 :(得分:2)

您想查看nftw。这是一个以C(未测试):

递归打印目录内容的示例
#define _XOPEN_SOURCE 500
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <ftw.h>


int
print( const char *path, const struct stat *s, int flag, struct FTW *f )
{
    puts( path );
    return 0;
}


int
main( int argc, char **argv )
{
    while( *++argv ) {
        if( nftw( *argv, print, 1024, FTW_DEPTH )) {
            perror( *argv );
            return EXIT_FAILURE;
        }
    }
    return EXIT_SUCCESS;
}

答案 1 :(得分:2)

以下是我使用Boost.Filesystem

的方式
#include "boost/filesystem.hpp"
#include <iostream>

int main () {
  for ( boost::filesystem::recursive_directory_iterator end, dir("./");
    dir != end; ++dir ) {
    // std::cout << *dir << "\n";  // full path
    std::cout << dir->path().filename() << "\n"; // just last bit
  }
}

或者,更简洁:

#include "boost/filesystem.hpp"
#include <iostream>
#include <iterator>
#include <algorithm>

int main () {

  std::copy(
    boost::filesystem::recursive_directory_iterator("./"),
    boost::filesystem::recursive_directory_iterator(),
    std::ostream_iterator<boost::filesystem::directory_entry>(std::cout, "\n"));
}

答案 2 :(得分:1)

Unix / Linux / Windows都有readdir()的版本。您可以使用它来获取文件系统对文件的了解。