【Linux系统编程】18.opendir、closedir、readdir

目录

opendir

closedir

readdir

测试代码1

测试结果

测试代码2

测试结果

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;
}

测试结果

猜你喜欢

转载自blog.csdn.net/CETET/article/details/130955724
今日推荐