目录的读写

一、文件流和字符描述的转换
1.1、fileno

要求的是内存大小一致

fileno FILE* fp -> int fd fgets(,); int fileno(FILE *stream);

功能: 获得一个文件流指针中的文件描述符

参数: stream:文件流指针

返回值: 成功返回文件描述符 失败返回-1

如果没有特殊要求的,关闭封装度高的函数。

1.2.fdopen

int fd -> FILE *fp FILE *fdopen(int fd, const char *mode);

功能: 这是一个函数,不是强制类型转换 将文件描述符转化为文件流指针

参数: fd:已经打开的文件描述符 mode: "r" "r+" "w" "w+" "a" "a+"

返回值: 成功返回文件流指针 失败返回NULL

二、目录相关操作
2.1 操作流程
  1. 打开目标目录  
  2. 读取目录
  3. 关闭目录

目录 当文件看,只不过操作函数和操作文件函数不一样。

2.2 opendir 打开目录

DIR *opendir(const char *name);

功能: 打开一个目录获得一个目录流指针

参数: name:目录名

返回值: 成功返回目录流指针 失败返回NULL

* dir 是通过opendir 获取的,他代表的是整个目录 ;在系统里面叫目录入口,也叫做目录流指针

2.3.readdir 读目录

readdir struct dirent *readdir(DIR *dirp)

功能: 从目录流中读取文件信息并将保存信息的结构体 地址返回

参数: dirp:目录流指针

返回值: 包含文件信息的结构体 出错或者读到目录流末尾返回NULL

  •  * info 代表目录的一项,目录里面有很多,要想拿多个,多次调用即可

  • 想把文件都读出来,那么我们直接循环读出来,因为我们也不知道他有多少个

  • 我们只需要关注文件名和类型

  • 判断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.

  • DT_UNKNOWN  The  file  type  could not be deter‐mined.
     

2.4 closedir关闭目录

int closedir(DIR *dirp);

功能:关闭之前已经打开的目录流对象

参数:opendir的返回结果中目录流对象

返回值:成功 0 失败 -1;、

对目录读进行操作的代码示例 

#include<stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int agrc,char *argv[])
{
    DIR* dir  = opendir("./");
    if(NULL == dir)
    {
        printf("opendir error");
        return 1;
    }
    while(1)
    {
        struct dirent * info = readdir(dir);
        if(NULL == info)
        {
            break;
        }
        switch(info->d_type)
        {
            case DT_DIR:
            printf("目录  ");
            break;
            case DT_BLK:
            printf("块设备  ");
            break;
            case DT_CHR:
            printf("字符设备  ");
            break;
            case DT_REG:
            printf("普通文件  ");
            break;
            default:
            printf("其他  ");
            break;
        }
        printf("%s\n",info->d_name);
    }
    closedir(dir);
2.5.getcwd

getcwd等价于命令pwd char *getcwd(char *buf, size_t size)

buf 接收当前的

屁股后面会放\0

路径,创建一个buf 功能: 获得当前的工作路径

参数: buf:保存工作路径空间的首地址 size:保存路径空间的长度(buf 的最大长度)

返回值: 成功返回包含路径空间的字符串首地址 失败返回NULL

2.6.mkdir

int a =200; int mkdir(const char *pathname, mode_t mode);//777 666 --x--x--x (mode 给权限) 功能: 创建一个目录 666-权限给的是775,默认是775,但由于umask的值,和目录和文件的权限与其有关,将这个数减掉。

对于目录来说 x 是cd 看起能不能切换进去。

目录名不能重名,文件也不能重名,区分大小写

参数: pathname:路径 mode: mode & ~umask 0002

写好之后进去会自动做该操作

返回值: 成功返回0 失败返回-1

2.7.rmdir

rm -fr rmdir int rmdir(const char *pathname);

功能: 删除一个空目录文件

前提是空目录,./ ../ 这是一个空目录,我们认为其是空目录

参数: pathname:目录文件的名字 返回值: 成功返回0 失败返回-1

 2.8 stat

1.stat 获取文件的详细属性 ()

int stat(const char *path, struct stat *buf);

INODE (文件在硬盘上的编号,也就是位置)

文件名和内容分开放;软连接删掉没有影响,但是硬链接删除之后,软连接就无法正常使用

st 结构体变量不需要我们填写,由函数进行填写

重点

ino_t

mode_t 文件的类型以及权限(类似777)

注意在代码书写的过程中,换行的时候将优先级的放在第二行前

gid_t 组号

st_size 字节数

时间在系统中记得是从1970年1月1号之后到现在的总秒数,一秒一记

mode 模式无法直接出来,需要调用inode,调用宏文件进行判断。宏判断特定7位上是不是1

判断权限 进行位运算,在其mode 里面由=有32位,低9位就是 实际上的权限位置,我们进行系统里面的宏运算,进行位运算,来判断其权限

功能: 获得文件的属性

参数: pzath: 文件的路径

buf: 属性存放空间的首地址

返回值: 成功返回0 失败返回-1

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值