linux readdir64

#include
#include
#include
#include
#include

#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

你可能感兴趣的:(Linux,linux)