我需要枚举文件夹中的所有文件,然后导航到子文件夹并执行相同的操作(递归?确定)。
理想情况下,算法应该在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!
答案 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()的版本。您可以使用它来获取文件系统对文件的了解。