【问题标题】:How can I enumerate all the file in a directory in vfs c or c++? [duplicate]如何枚举 vfs c 或 c++ 目录中的所有文件? [复制]
【发布时间】:2013-01-29 07:11:42
【问题描述】:

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

理想情况下,算法应该在 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 programming interface

谢谢!

【问题讨论】:

  • 不是真正的骗子,因为 C++ 可能有更好的选择。
  • 您在寻找 C++ 还是 C?要么选择一个,要么在你的问题中解释为什么你需要两者。
  • 我对一个简单易用的 C 解决方案很感兴趣,我将把它包装在一个 cpp 容器中。为了更好地理解,我在这里的单个 c 文件中创建了一个带有简单 windows 测试的快速 github 项目:github.com/maborg/scandir 随时 fork 修改。只是为了好玩(相关的c文件在这里:github.com/maborg/scandir/blob/master/scandir/readdir.c
  • 我也试图了解是否有“标准”解决方案(VFS?)
  • 旁白:你能提供一个 VFS 的链接吗?我想更新标签 wiki。具体来说,你指的是commons.apache.org/vfs吗?

标签: c++ c linux unix vfs


【解决方案1】:

你想看看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"));
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多