摘要:C/C++獲取指定目錄的所有的文件一直不存在一個可移植的方案,直至boost::filesystem出現(xiàn),并被標準庫接受為止。本文介紹了多個平臺中C/C++獲取目錄結點的方法,并指出filesystem庫的方式是C++標準方法。
問題
在寫程序經(jīng)常需要知道當前或相應目錄存在哪些文件,或者指定文件存在與否。那么在C/C++如何完成呢?
答案
現(xiàn)在實中大家最常見的存在兩種平臺,一個平臺是Windows平臺,一個平臺是Linux或者說POSIX平臺,在這兩個平臺中完成相同的事有著不同的方法,但是都非常簡單的。一組簡單的函數(shù)就可以完成這些操作,對于應用程序而言我們往往只需要這些。
在POSIX中,我們使用opendir、readdir、closedir來完成這個簡單的任務;在Windows中,我使用findfirst、findnext、findclose來完成。由于我使用Linux系統(tǒng),并且平時沒有在Windows下寫過程序,所以下面我們只是針對POSIX平臺說明,其實沒有什么說明,給出一個簡單的例子就可以了:
#include<sys/types.h>
#include<dirent.h>
//打開當前目錄,然后讀取當前目錄中所有的結點
//并打印這個結點的名字
int main()
{
//打開當前的目錄
DIR* dir=opendir(".");
//目錄里的一個結點
struct dirent* entry;
while((entry=readdir(dir)))
{
//打印第一個結點的名字
std::cout << entry->d_name << std::endl;
}
//關閉相應的目錄
closedir(dir);
return 0;
}
上面的程序可以在Linux正常運行。
我也注意了一下Windows的處理方式,它的函數(shù)接口沒有Linux簡捷,但卻功能要豐富一點,它提供了一個搜索的功能。
下面我說說如果移植解決我們這里的問題,要做到移植性需要一個中間層,這個中間層可以是我們手工去實現(xiàn),也可以使用別人的實現(xiàn)。當然如果別人已經(jīng)實現(xiàn)好了,那么就拿用吧,boost::filesystem已經(jīng)做到這一點了。本站存在這個庫的手冊,所以在這里就不多說了,可以過去參看:boost::filesystem指南。