linux readdir64

#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#if 0
struct dirent64 *readdir64(DIR* DIRP);

readdir64() 函数类似于 readdir() 函数,是大型文件扩展名。

返回值
    如果成功,readdir() 和 readdir64() 返回指向对象的指针结构型 dirent 或结构型 dirent64。

    #ifdef __USE_LARGEFILE64
    struct dirent64
      {
        __ino64_t d_ino;
        __off64_t d_off;
        unsigned short int d_reclen;
        unsigned char d_type;
        char d_name[256];           /* We must not include limits.h! */
      };
    #endif

#endif

static int test() 
{
    DIR * p_dir = NULL;
    struct dirent64 * dp = NULL;
    int len = -1;
    char *name = "aaaaa";
    char *ptr;

    // 通过opendir打开目录
    p_dir = opendir("/proc");
    if (p_dir == NULL) {
       return (-1);
    }

    len = strlen(name);

    //  开始遍历p_dir文件夹
    while ((dp = readdir64(p_dir)) != NULL) {     
        //printf("inode number:%ld offset:%ld len:%d\n", dp->d_ino, dp->d_off, dp->d_reclen);
        printf("name:%s:%d\n", dp->d_name, dp->d_type);

        //  比较dp->d_name与name的值, 如果匹配则返回
        if (dp->d_reclen == len && strcmp(dp->d_name, name) == 0) {
            (void)closedir(p_dir);
            return 0;
        }

        if (strtol(dp->d_name, &ptr, 0xa) != 0)
            break;
    }

    printf("sizeof(struct dirent)=%d, -name=%d\n", sizeof(struct dirent64), sizeof(struct dirent64) - 256);
    printf("sizeof(ino_t)=%d, sizeof(off_t)=%d\n", sizeof(ino_t), sizeof(off_t));

    //  关闭dir
    (void)closedir(p_dir);

    return 0;
}

int main()
{
    test();

    return 0;
}

#if 0

// 以上代码如果编译报错需开启以下定义

在所有头文件之前添加

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64

或者更改编译选项

gcc -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值