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