对目录的操作(opendir)

1.opendir函数(打开目录)

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);
功能:打开目录
参数:
    @name:目录名
返回值:成功返回目录指针,失败返回NULL置位错误码

2.readdir函数(读取目录下的内容)

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
功能:读取目录下的内容
参数:
    @dirp:目录的指针
返回值:成功返回dirent结构体指针
        失败返回NULL置位错误码
       struct dirent {
           ino_t          d_ino;       //读取到的文件的inode号
           off_t          d_off;       //无需关注
           unsigned short d_reclen;    //这个结构体的大小
           unsigned char  d_type;      //文件的类型
              DT_BLK      This is a block device.
              DT_CHR      This is a character device.
              DT_DIR      This is a directory.
              DT_FIFO     This is a named pipe (FIFO).
              DT_LNK      This is a symbolic link.
              DT_REG      This is a regular file.
              DT_SOCK     This is a UNIX domain socket.
           char           d_name[256];  //读取到文件的文件名
       };

3closedir函数(关闭目录)

int closedir(DIR *dirp);
功能:关闭目录
参数:
    @dirp:目录指针
返回值:成功返回0,失败返回-1,职位错误码

4目录操作的实例

#include <dirent.h>
#include <head.h>

int main(int argc, const char* argv[])
{
    DIR* dirp;
    struct dirent* dt;
    // 1.校验输入成员的个数
    if (argc != 2) {
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out dirname\n");
        return -1;
    }
    // 2.打开目录
    if ((dirp = opendir(argv[1])) == NULL)
        PRINT_ERR("open dir error");

    // 3.读取目录下的内容
    while ((dt = readdir(dirp)) != NULL) {
        switch (dt->d_type) {
        case DT_BLK:
            printf("这是块设备文件\n");
            break;
        case DT_CHR:
            printf("这是块设备文件\n");
            break;
        case DT_DIR:
            printf("这是目录文件\n");
            break;
        case DT_FIFO:
            printf("这是管道文件文件\n");
            break;
        case DT_LNK:
            printf("这是软连接文件\n");
            break;
        case DT_REG:
            printf("这是普通文件\n");
            break;
        case DT_SOCK:
            printf("这是套接字文件\n");
            break;
        }

        printf("name=%s,ino=%ld,size = %d\n",dt->d_name,dt->d_ino,dt->d_reclen);

    }

    closedir(dirp);
    return 0;
}

5.结合目录操作和stat函数打印某个目录下文件的属性信息

#include <dirent.h>
#include <head.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, const char* argv[])
{
    DIR* dirp;
    struct stat stbuf;
    struct dirent* dt;
    char buf[500];
    // 1.校验输入成员的个数
    if (argc != 2) {
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out dirname\n");
        return -1;
    }
    // 2.打开目录
    if ((dirp = opendir(argv[1])) == NULL)
        PRINT_ERR("open dir error");

    // 3.读取目录下的内容
    while ((dt = readdir(dirp)) != NULL) {
        switch (dt->d_type) {
        case DT_BLK:
            printf("这是块设备文件\n");
            break;
        case DT_CHR:
            printf("这是块设备文件\n");
            break;
        case DT_DIR:
            printf("这是目录文件\n");
            break;
        case DT_FIFO:
            printf("这是管道文件文件\n");
            break;
        case DT_LNK:
            printf("这是软连接文件\n");
            break;
        case DT_REG:
            printf("这是普通文件\n");
            break;
        case DT_SOCK:
            printf("这是套接字文件\n");
            break;
        }
        printf("name=%s,ino=%ld,size = %d\n", dt->d_name, dt->d_ino, dt->d_reclen);

        //在文件名前拼接上文件的路径
        memset(buf,0,sizeof(buf));
        snprintf(buf,sizeof(buf),"%s/%s",argv[1],dt->d_name);

        if (stat(buf, &stbuf))
            PRINT_ERR("get stat error");

        printf("uid = %d,gid = %d,size = %ld,mode = %#o\n", stbuf.st_uid,
            stbuf.st_gid, stbuf.st_size, stbuf.st_mode & 0777);

        printf("usrname = %s,groupname = %s\n",
            getpwuid(stbuf.st_uid)->pw_name,getgrgid(stbuf.st_gid)->gr_name);
    }

    closedir(dirp);
    return 0;
}

6.输入一个文件名和目录,判断这个目录下是否有这个文件

#include <dirent.h>
#include <head.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, const char* argv[])
{
    DIR* dirp;
    struct stat stbuf;
    struct dirent* dt;
    char buf[500];
    // 1.校验输入成员的个数
    if (argc != 3) {
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out filename pathname\n");
        return -1;
    }
    // 2.打开目录
    if ((dirp = opendir(argv[2])) == NULL)
        PRINT_ERR("open dir error");

    // 3.读取目录下的内容
    while ((dt = readdir(dirp)) != NULL) {
        if(!strcmp(argv[1],dt->d_name){
            printf("你查找的文件存在\n");
            return 0;
        }
    
    }
    printf("你查找的文件不存在\n");

    closedir(dirp);
    return 0;
}
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值