2

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

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

免责声明:我在 POSIX 上提出了类似的问题:我现在知道 VFS,但我对使用 VFS 枚举目录感到困惑。有什么建议吗?我应该打开一个目录作为文件吗?唯一的方法是使用像 qt 这样的库跨平台?

更新:所以没有VFS方式来处理目录?“* V *irtual * F *ile * S *ystem 提供了用于访问各种不同文件系统的单一 API”,但无法枚举目录。

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

BOOST 似乎是一个非常酷的解决方案,但它既复杂又学术。无论如何谢谢

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

VFS(虚拟文件切换)是一个内核特性,它通过为文件系统操作创建一个抽象层来解决这个问题。此处关闭文档:linux编程接口

谢谢!

4

3 回答 3

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;
}
于 2013-02-13T16:52:47.643 回答
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"));
}
于 2013-02-13T17:39:27.373 回答
1

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

于 2013-02-13T17:57:40.857 回答