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

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现ls -l命令的关键是要读取当前目录下的文件和文件夹的信息,并将其格式化输出。下面是一个简单的C语言程序,实现了类似于ls -l的功能: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <pwd.h> #include <grp.h> #include <time.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *entry; struct stat statbuf; struct passwd *pwd; struct group *grp; char date[20]; if ((dp = opendir(".")) == NULL) { fprintf(stderr, "Cannot open directory.\n"); exit(1); } while ((entry = readdir(dp)) != NULL) { if (entry->d_name[0] == '.') continue; if (lstat(entry->d_name, &statbuf) < 0) continue; printf((S_ISDIR(statbuf.st_mode)) ? "d" : "-"); printf((statbuf.st_mode & S_IRUSR) ? "r" : "-"); printf((statbuf.st_mode & S_IWUSR) ? "w" : "-"); printf((statbuf.st_mode & S_IXUSR) ? "x" : "-"); printf((statbuf.st_mode & S_IRGRP) ? "r" : "-"); printf((statbuf.st_mode & S_IWGRP) ? "w" : "-"); printf((statbuf.st_mode & S_IXGRP) ? "x" : "-"); printf((statbuf.st_mode & S_IROTH) ? "r" : "-"); printf((statbuf.st_mode & S_IWOTH) ? "w" : "-"); printf((statbuf.st_mode & S_IXOTH) ? "x" : "-"); printf(" %2lu", statbuf.st_nlink); if ((pwd = getpwuid(statbuf.st_uid)) != NULL) { printf(" %s", pwd->pw_name); } else { printf(" %d", statbuf.st_uid); } if ((grp = getgrgid(statbuf.st_gid)) != NULL) { printf(" %s", grp->gr_name); } else { printf(" %d", statbuf.st_gid); } strftime(date, 20, "%b %d %H:%M", localtime(&statbuf.st_mtime)); printf(" %s", date); printf(" %s\n", entry->d_name); } closedir(dp); return 0; } ``` 这个程序使用了许多系统调用和库函数,比如opendir、readdir、lstat、getpwuid、getgrgid等等。它首先打开当前目录("."),然后循环读取目录下的每个文件和文件夹的信息,使用lstat函数获取文件的详细信息,再利用各种库函数将这些信息格式化输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因心,三人水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值