Linux C/C++编程:打开读取关闭目录

理论

#include<sys/types.h>
#include<dirent.h>
/*
* 功能: 打开一个目录,在失败的时候返回一个空的指针。
* 参数: 路径名
* 返回值:指向目录流 (directory stream) 的指针(执行path目录下所有文件和目录的列表)
* 错误代码:
* 	     1、EACCESS 权限不足。
*        2、EMFILE 已达到进程可同时打开的文件数上限。
*        3、ENFILE 已达到系统可同时打开的文件数上限。
*        4、ENOTDIR 参数name 非真正的目录。
*        5、ENOENT 参数name 指定的目录不存在, 或是参数name 为一空字符串。
*        6、ENOMEM 核心内存不足。
*/
typedef struct __dirstream DIR;
struct __dirstream   
   {   
    void *__fd;    
    char *__data;    
    int __entry_data;    
    char *__ptr;    
    int __entry_ptr;    
    size_t __allocation;    
    size_t __size;    
    __libc_lock_define (, __lock)    
   };
DIR *opendir (const char *__name)
/*
* 功能: 循环读取__dirp指向的列表
* 返回值:
* (1)是指向流 dirp 中下一个目录项的指针 ,如果没有更多目录项则返回 NULL
* (2)如果出错,则 readdir 返回 NULL, 并设置 errno
*/
struct dirent
{
    ino_t d_ino;    //文件位置
    ff_t d_off;    //目录文件开头至此目录进入点的位移
    signed short int d_reclen;     //d_name 的长度,不包含NULL
    unsigned char d_type;     //d_name 所指的文件类型
    har d_name[256];     //文件名
}
struct dirent *readdir (DIR *__dirp)
/*
* 功能:关闭流并释放其所有的资源
*/
int closedir (DIR *__dirp)

实践

读取

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>


int main(int argc, char **argv)
{
    DIR *streamp;
    struct dirent *dep;

    /* $end readdir */
    if (argc != 2) {
        printf("usage: %s <pathname>\n", argv[0]);
        exit(1);
    }
    /* $begin readdir */
    streamp = opendir(argv[1]);

    errno = 0;
    while ((dep = readdir(streamp)) != NULL) {
        //过滤. 和 ..
        if(strcmp(dep->d_name, ".") == 0 || strcmp(dep->d_name, "..") == 0){
            continue;
        }
        printf("Found file: %s\n", dep->d_name);
    }
    if (errno != 0){
        printf("readdir error");
        exit(0);
    }
        

    closedir(streamp);
    exit(0);
}

封装

DIR *Opendir(const char *name) 
{
    DIR *dirp = opendir(name); 

    if (!dirp){
		printf("opendir error");
		exit(0);
	}
        
    return dirp;
}

struct dirent *Readdir(DIR *dirp)
{
    struct dirent *dep;
    
    errno = 0;
    dep = readdir(dirp);
    if ((dep == NULL) && (errno != 0)){
        printf("readdir error");
		exit(0);
	}
        
    return dep;
}

int Closedir(DIR *dirp) 
{
    int rc;

    if ((rc = closedir(dirp)) < 0){
		printf("closedir error");
		exit(0);
	}
        
    return rc;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值