2013-02-13 52 views
1

我需要枚举文件夹中的所有文件,然后导航到子文件夹并执行相同的操作(递归?肯定)。如何枚举vfs c或C++目录中的所有文件?

理想的算法应该以同样的方式运行在Linux上&的MacOS

免责声明:我已要求对POSIX一个类似的问题:我现在知道VFS的,但我疑惑地使用VFS的枚举目录。任何建议?我应该打开一个目录作为文件?唯一的方法是使用类似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似乎是一个非常酷的解决方案,但它是复杂的和学术的。在任何情况下

最后更新 thnks:
我已经发现了一些更doc和现在一切都很多更加清晰。 这个问题是重复的! opendir()和readdir()是在Linux上枚举和浏览目录的解决方案。正如我的例子所示,很容易将它们映射到窗口上(但是无意义的windowz fs使一切都变得陌生)并且ntfw()更加有用。

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

thnks!

+0

因为C++可能有更好的选择,所以不是真正的骗局。 – 2013-02-13 17:04:21

+0

你在寻找C++还是C?选择一个,或者在你的问题中解释为什么你需要两个。 – 2013-02-13 17:37:20

+0

我在一个C简单和容易的解决方案,我会包装在一个CPP容器。为了更好地解决问题,我创建了一个快速的github项目,并在一个c文件中使用简单的windows测试:https://github.com/maborg/scandir随时发布修改。只是为了好玩的课程(相关的c文件在这里:https://github.com/maborg/scandir/blob/master/scandir/readdir。c) – maborg 2013-02-15 15:01:01

回答

1

Unix/Linux/Windows的版本都是readdir()。您可以使用它来获取文件系统知道的文件。

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; 
} 
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")); 
} 
相关问题