摘要:C/C++获取指定目录的所有的文件一直不存在一个可移植的方案,直至boost::filesystem出现,并被标准库接受为止。本文介绍了多个平台中C/C++获取目录结点的方法,并指出filesystem库的方式是C++标准方法。
问题
在写程序经常需要知道当前或相应目录存在哪些文件,或者指定文件存在与否。那么在C/C++如何完成呢?
答案
现在实中大家最常见的存在两种平台,一个平台是Windows平台,一个平台是Linux或者说POSIX平台,在这两个平台中完成相同的事有着不同的方法,但是都非常简单的。一组简单的函数就可以完成这些操作,对于应用程序而言我们往往只需要这些。
在POSIX中,我们使用opendir、readdir、closedir来完成这个简单的任务;在Windows中,我使用findfirst、findnext、findclose来完成。由于我使用Linux系统,并且平时没有在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的处理方式,它的函数接口没有Linux简捷,但却功能要丰富一点,它提供了一个搜索的功能。
下面我说说如果移植解决我们这里的问题,要做到移植性需要一个中间层,这个中间层可以是我们手工去实现,也可以使用别人的实现。当然如果别人已经实现好了,那么就拿用吧,boost::filesystem已经做到这一点了。本站存在这个库的手册,所以在这里就不多说了,可以过去参看:boost::filesystem指南。