目录
opendir
根据传入的目录名打开一个目录。
man 3 opendir
closedir
关闭打开的目录。
man 3 closedir
readdir
读取目录。
man 3 readdir
测试代码1
输出目录下的文件。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *rdir;
dir = opendir(argv[1]);
if (dir == NULL)
{
perror("opendir error");
exit(1);
}
while ((rdir = readdir(dir)) != NULL)
{
if((strcmp(rdir->d_name,"."))==0){ //忽略“.”文件
continue;
}
if((strcmp(rdir->d_name,".."))==0){ //忽略“..”文件
continue;
}
printf("%s\n",rdir->d_name);
}
closedir(dir);
return 0;
}
测试结果
测试代码2
递归遍历目录,输出文件名及大小。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <dirent.h>
void PanDuan_WenJian_LeiXing(char *WenJianMing); //判断文件类型
void DuQu_MuLu(char *MuLuMing); //读取目录
int main(int argc, char *argv[])
{
if (argc == 1) //只传1个参数
{
PanDuan_WenJian_LeiXing(".");
}
else
{
PanDuan_WenJian_LeiXing(argv[1]);
}
return 0;
}
void PanDuan_WenJian_LeiXing(char *WenJianMing)
{
int flag;
struct stat WenJian_XinXi; //文件信息
flag = stat(WenJianMing, &WenJian_XinXi); //根据文件名获取文件信息
if (flag < 0)
{
perror("获取文件信息错误");
return;
}
if (S_ISDIR(WenJian_XinXi.st_mode)) //判断文件类型是否为目录
{
DuQu_MuLu(WenJianMing);
}
printf("%s\t大小:%ld\n", WenJianMing, WenJian_XinXi.st_size);
return;
}
void DuQu_MuLu(char *MuLuMing)
{
DIR *MuLuXiang; //目录项
struct dirent *MuLuXiang_XinXi; //目录项信息
char LuJing_WenJianMing[1024]; //路径文件名
MuLuXiang = opendir(MuLuMing);
if (MuLuXiang == NULL)
{
perror("打开目录错误");
return;
}
while ((MuLuXiang_XinXi = readdir(MuLuXiang)) != NULL) //获取目录项信息
{
if (strcmp(MuLuXiang_XinXi->d_name, ".") == 0 || (strcmp(MuLuXiang_XinXi->d_name, "..") == 0)) //避免“.”、“..”引起的重复递归
{
continue;
}
sprintf(LuJing_WenJianMing, "%s/%s", MuLuMing, MuLuXiang_XinXi->d_name);
PanDuan_WenJian_LeiXing(LuJing_WenJianMing);
}
closedir(MuLuXiang);
return;
}