2013-02-13 50 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")); 
} 
相關問題