目录操作的相关API 和 获取文件的属性信息

目录

一,目录操作的相关API

1,创建或删除一个空目录

2,打开目录

3,读一个目录

4,关闭一个目录

二,获取文件的属性信息

1, stat,fstat,lstat 用来获取文件的属性信息

2,access

3,umask 用来指定文件的权限掩码位

4,chmod/fchmod 

5,truncate/ftruncate

6,getcwd

7,chdir

9,system

一,目录操作的相关API

1,创建或删除一个空目录

          #include <sys/stat.h>

          #include <sys/types.h>

           int mkdir(const char *pathname, mode_t mode);

@pathname: 要创建的目录的路径

@mode : 指定目录的权限,用八进制表示 0777

成功返回0,失败返回-1

       rmdir 只能删除一个空目录

            int rmdir(const char *pathname);

2,打开目录

#include<sys/types.h>

#include<dirent.h>

opendir和fdopendir都是用来打开一个目录,只不过opendir是用路径名来指定目录,而fdopendir是用文件描述符来指定目录。

       DIR *opendir(const char *name);

       DIR *fdopendir(int fd);

如果成功返回一个DIR的指针,在Unix/Linux下面,目录用DIR结构体来维护的。

失败返回NULL,errno被设置

3,读一个目录

#include <dirent.h>

readdir用来从dirp指定的目录中,读取其中的目录项(struct dirent)并返回。

目录文件就是一个目录项数组,里面保存的是文件的i-node编号

            struct dirent *readdir(DIR *dirp);

               @dirp: 表示要读哪一个打开的目录

返回值: 如果成功返回一个目录项(struct dirent指针),遍历该数组的下标加一。下次再调用readdir               读同一个目录,则返回下一个目录项。如果读完了或者出错了,则返回NULL。

              struct dirent {

               ino_t          d_ino;       //该文件的i-node编号

               off_t          d_off;       //偏移量,即数组的下标

               unsigned short d_reclen;    //这条结构体的长度

               unsigned char  d_type;      //该目录项对象的文件的类型

                (有些文件系统不支持)

               char           d_name[256]; //文件的名字(不带路径)

           };

        NOTE: 只有d_ino和d_name这两个成员变量是被所有的系统支持的。

4,关闭一个目录

int closedir(DIR *dirp);

二,获取文件的属性信息

1, stat,fstat,lstat 用来获取文件的属性信息

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

stat 用来把pathname指定的文件(包含目录,普通文件,设备文件)的状态及属性信息

保存到statbuf指向的结构体变量中去。

fstat与stat的功能类似,只不过该函数使用文件描述符来指定文件。

lstat与stat的功能类似,只不过pathname指定的文件如果是符号链接时,lstat获取的是符号链接文件本身的属性,而stat获取的是链接文件指向的文件的属性。

       int stat(const char *pathname, struct stat *statbuf);

       int fstat(int fd, struct stat *statbuf);

       int lstat(const char *pathname, struct stat *statbuf);

返回值:

成功,返回0

失败,返回-1,errrno被设置

在linux/Unix中文件的属性信息,用结构体struct stat来表示的,其内容为:

struct stat {

               dev_t     st_dev;  //dev_t设备号类型,容纳该文件的那个设备的设备号

               ino_t     st_ino;  //inode number

               mode_t    st_mode; //文件的权限(包含类型)

               nlink_t   st_nlink;//Inode的硬链接数

               uid_t     st_uid;  //文件的属主的用户ID

               gid_t     st_gid;  //文件属主的组ID

               dev_t     st_rdev; //设备号(如果该文件时候是设备文件)

               off_t     st_size; //文件内容的长度(字节)

//st_size对普通文件(文本文件、二进制文件)指文件内容长度

//st_size对目录而言,文件长度通常是一个数的倍数

//st_size对符号链接文件,符号链接文件的内容是指向文件的名字

               blksize_t st_blksize; //block size 块大小 (与具体的硬件有关)

               blkcnt_t  st_blocks; //文件占多少块(在linux下面每个块是512字节)

               struct timespec st_atim; //最近访问"文件内容"的时间

               struct timespec st_mtim; //最近修改"文件内容"的时间

               struct timespec st_ctim; //最近改变"文件属性"的时间

};

        其中 st_mode 包含了文件的类型与权限,我们可以用下列的宏来解析

        S_ISREG(st.st_mode) 为真,表示为普通文件(regular file) -

        S_ISDIR(st.st_mode) 为真,表示为目录文件(directory) d

        S_ISCHR(st.st_mode) 为真,表示为字符设备文件(char)  c

        S_ISBLK(st.st_mode) 为真,表示为块设备文件(block) b

        S_ISFIFO(st.st_mode) 为真,表示为管道文件(pipi) p

        S_ISLNK(st.st_mode) 为真,表示为符号链接文件(link) l

        S_ISSOCK(st.st_mode) 为真,表示为套接字文件(socket) s

        判断文件的权限位,我们可以用下列的宏来解析

        S_IRUSR  S_IWUSR   S_IXUSR

        S_IRGRP  S_IWGRP   S_IXGRP

        S_IROTH  S_IWOTH   S_IXOTH

                if(st.st_mode & S_IRUSR)

                {

                //该文件对用户有读的权限

                }

2,access

       #include <unistd.h>

      access用来测试调用进程是否有相应的权限去访问pathname指定的文件

       int access(const char *pathname, int mode);

        @pathname: 要测试的文件的路径名

        @mode: 要测试的访问权限,按位或测试多个权限

        R_OK: 测试读的权限

        W_OK: 测试写的权限

        X_OK: 测试执行的权限

        F_OK: 测试文件是否存在

        返回值:

                0 所有测试的权限都OK

                -1 至少有一项测试权限不OK

                3,umask

3,umask 用来指定文件的权限掩码位

        umask中为1的权限位,你会创建文件时,不能指定,我们称为安全权限。

        比如在根目录下写的权限会被掩盖掉。最后效果为 与上掩码的取反

               mode_t umask(mode_t mask);

4,chmod/fchmod 

        用来改变文件的权限位

        chmod/fchmod 用来改变文件的权限位,只不过chmod用pathname字符串指定文件名,

fchmod用文件描述符来指定文件名。

       int chmod(const char *pathname, mode_t mode);

       int fchmod(int fd, mode_t mode);

5,truncate/ftruncate

        truncate/ftruncate用来把文件截短到指定的长度

       int truncate(const char *path, off_t length);

       int ftruncate(int fd, off_t length);

        注意: 把一个文件截短首先需要有写的权限

6,getcwd

        getcwd用来获取当前的工作路径(绝对路径),保存到buf指向的字符数组,数组大小为size

       char *getcwd(char *buf, size_t size);

7,chdir

        chdir用来把当前路径修改为path指定的路径(实质上是把进程的PWD环境变量进行修改)

       int chdir(const char *path);

        用来删除一个文件或目录

        remove用来删除一个文件或者一个空目录

                     int remove(const char *pathname);

        unlink用来删除一个文件

         int unlink(const char *pathname);

9,system

         用来执行一个程序或者命令

       #include <stdlib.h>

       int system(const char *command);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amireux512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值