目录的操作

简介: 目录的操作

文件的描述

/*
 * File types
 *
 * NOTE! These match bits 12..15 of stat.st_mode
 * (ie "(i_mode >> 12) & 15").
 */
#define DT_UNKNOWN    0
#define DT_FIFO        1    //管道
#define DT_CHR        2    //字符设备
#define DT_DIR        4    //目录
#define DT_BLK        6    //块设备
#define DT_REG        8    //普通文件
#define DT_LNK        10    //链接
#define DT_SOCK        12    //套接字
#define DT_WHT        14

这个结构体是用来返回有关目录项的信息的。它包含以下字段:d_ino 是文件序列号,d_off 是目录文件开头到此目录项的偏移量,d_reclen 是此记录的长度,d_name 是以空字符结尾的文件名组件。

struct compat_linux_dirent {
    compat_ulong_t    d_ino;
    compat_ulong_t    d_off;
    unsigned short    d_reclen;
    char        d_name[1];
};

opendir: 打开目录

头文件: sys/types.h dirent.h

函数定义: DIR opendir(const char name);
说明: opendir()用来打开参数 name 指定的目录, 并返回 DIR
形态的目录流, 和 open()类似, 接下来对目录的读取和搜索都要使用此返回值. 成功则返回 DIR
型态的目录流, 打开失败则返回NULL.

错误代码:

EACCESS 权限不足

EMFILE 已达到进程可同时打开的文件数上限

ENFILE 已达到系统可同时打开的文件数上限

ENOTDIR 参数 name 非真正的目录

ENOENT 参数 name 指定的目录不存在, 或是参数 name 为一空字符串

ENOMEM 核心内存不足

readdir: 读取目录

头文件: sys/types.h dirent.h

定义函数: struct dirent *readdir(DIR *dir);

说明: readdir()返回参数 dir 目录流的下个目录进入点.

结构 dirent 定义如下:

struct dirent{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
char d_name[256];
};

d_ino 此目录进入点的

inode d_off 目录文件开头至此目录进入点的位移

d_reclen _name 的长度, 不包含 NULL 字符

d_type d_name 所指的文件类型

d_name 文件名成功则返回下个目录进入点, 有错误发生或读取到目录文件尾则返回 NULL. EBADF 参数 dir 为无效的目录流

closedir: 关闭目录

头文件: sys/types.h dirent.h

函数定义: int closedir(DIR *dir);

说明: closedir()关闭参数 dir 所指的目录流. 关闭成功则返回 0, 失败返回-1, 错误原因存于errno 中. EBADF 参数 dir 为无效的目录流.

readlink: 取得符号连接所指的文件

头文件: unistd.h

函数定义: int readlink(const char *path, char *buf, size_t bufsize);

说明: readlink()会将参数 path 的符号连接内容存到参数 buf 所指的内存空间, 返回的内容不是以 NULL 作字符串结尾, 但会将字符串的字符数返回. 若参数 bufsiz 小于符号连接的内容长度,过长的内容会被截断. 执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于 errno.

错误代码:

EACCESS 取文件时被拒绝, 权限不够

EINVAL 参数 bufsiz 为负数

EIO I/O 存取错误

ELOOP 欲打开的文件有过多符号连接问题

ENAMETOOLONG 参数 path 的路径名称太长

ENOENT 参数 path 所指定的文件不存在

ENOMEM 核心内存不足

ENOTDIR 参数 path 路径中的目录存在但却非真正的目录

eg

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#define DIRNAME        "/www"
#define PHOTO_NUM_MAX        100
int main(int argc,void ** argv)
{
    DIR *dir;
    struct dirent *dirp;
    int total_num = 1;
    if(argc <=1)
    {
        printf("input dir\n");
        exit(0);
    }
    if((dir = opendir(argv[1])) == NULL)    //打开图片存放的目录
    {
        perror("fail to opendir");
        exit(1);
    }
    while((dirp = readdir(dir)) != NULL)  //读文件夹里文件的名字
    {
        if((strcmp(dirp->d_name,".")==0)||(strcmp(dirp->d_name,"..")==0))
        {
            continue;
        }
        printf( "type=%d %s\n",dirp->d_type,dirp->d_name);
        total_num++;
    }
    printf("\ntotal file number :%d\n",total_num);
    closedir(dir);
    return 0;
}

sudo ./a.out /etc/

sudo ./a.out ./


目录
相关文章
|
6月前
|
弹性计算 运维 Shell
删除某个目录下大小为 0 的文件
【4月更文挑战第28天】
51 0
使用jinjia2同时创建多个目录
使用jinjia2同时创建多个目录
54 0
|
Java
Java 创建文件自动新增父目录、查询目录文件、删除文件目录下面的文件
要处理文件保存和删除的操作,记录一下以免遗忘: 1、创建文件,并且自动创建父目录 2、删除目录下面的所有文件
154 0
文件复制操作
文件复制操作
59 0
|
Linux 数据库 数据安全/隐私保护
5.2.3目录与文件之权限意义
5.2.3目录与文件之权限意义
77 0
|
搜索推荐
更改目录
写完了一篇文章,进行对标题实现一个自动更改的目的,通过word对文章标题实现一个自动更改目录的功能,在更改的过程中遇到了出现了很多不明白的地方的,也是让自己陷入了两难的境界。
52 0
|
Unix Shell 测试技术
Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件
Python 文件复制&按目录树结构拷贝&批量删除目录及其子目录下的文件
146 0
文件和文件夹的操作——文件夹的操作
文件和文件夹的操作——文件夹的操作
138 0
文件和文件夹的操作——文件夹的操作
|
PHP Apache JavaScript