Linux文件和目录操作

文件操作相关函数

stat/lstat函数

函数描述: 获取文件属性

函数原型: int stat(const char *pathname, struct stat *buf);

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

函数返回值:

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

         struct stat

{

                  dev_t          st_dev;        //文件的设备编号

                  ino_t           st_ino;        //节点

                  mode_t         st_mode;      //文件的类型和存取的权限

                  nlink_t         st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1

                  uid_t           st_uid;       //用户ID

                  gid_t           st_gid;       //ID

                  dev_t          st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号

                  off_t          st_size;      //文件字节数(文件大小)

                  blksize_t       st_blksize;   //块大小(文件系统的I/O 缓冲区大小)

                  blkcnt_t        st_blocks;    //块数

                  time_t         st_atime;     //最后一次访问时间

                  time_t         st_mtime;     //最后一次修改时间

                  time_t         st_ctime;     //最后一次改变时间(指属性)

              };

              - st_mode -- 16位整数

                            ○ 0-2 bit -- 其他人权限

                                          S_IROTH      00004  读权限

                                          S_IWOTH     00002  写权限

                                          S_IXOTH      00001  执行权限

                                          S_IRWXO     00007  掩码, 过滤 st_mode中除其他人权限以外的信息

                            ○ 3-5 bit -- 所属组权限

                                          S_IRGRP     00040  读权限

                                          S_IWGRP    00020  写权限

                                          S_IXGRP     00010   执行权限

                                          S_IRWXG    00070  掩码, 过滤 st_mode中除所属组权限以外的信息

                            ○ 6-8 bit -- 文件所有者权限

                                          S_IRUSR    00400    读权限

                                          S_IWUSR   00200    写权限

                                          S_IXUSR    00100     执行权限

                                          S_IRWXU   00700    掩码, 过滤 st_mode中除文件所有者权限以外的信息

                                        If (st_mode & S_IRUSR)   -----为真表明可读

                                         If (st_mode & S_IWUSR)  ------为真表明可写

                                         If (st_mode & S_IXUSR)   ------为真表明可执行

0位文件类型 2-4位用户所有者权限 5-7是用户组权限 8-10是其他人权限

Chmod 777 文件名设置权限类型

                              ○ 12-15 bit -- 文件类型

                                          S_IFSOCK         0140000 套接字

                                          S_IFLNK          0120000 符号链接(软链接)

                                          S_IFREG          0100000 普通文件

                                          S_IFBLK           0060000 块设备

                                          S_IFDIR           0040000 目录

                                         S_IFCHR           0020000 字符设备

                                          S_IFIFO           0010000 管道

                                          S_IFMT 0170000 掩码,过滤 st_mode中除文件类型以外的信息

                                          If ((st_mode & S_IFMT)==S_IFREG) ----为真普通文件

                                         if(S_ISREG(st_mode))   ------为真表示普通文件

                                         if(S_ISDIR(st.st_mode))  ------为真表示目录文件

stat函数和lstat函数的区别

  • 对于普通文件, 这两个函数没有区别, 是一样的.
  • 对于连接文件,调用lstat函数获取的是链接文件本身的属性信息;stat函数获取的是链接文件指向的文件的属性信息.stat相当于有穿透功能。类似vi

stat函数获取文件大小

stat函数获取文件类型和文件权限

目录操作相关函数

opendir函数

  • 函数描述:打开一个目录
  • 函数原型: DIR *opendir(const char *name);
  • 函数返回值: 指向目录的指针
  • 函数参数: 要遍历的目录(相对路径或者绝对路径)

readdir函数

  • 函数描述: 读取目录内容--目录项
  • 函数原型: struct dirent *readdir(DIR *dirp);
  • 函数返回值: 读取的目录项指针
  • 函数参数: opendir函数的返回值

struct dirent

{

  ino_t d_ino;             // 此目录进入点的inode

  off_t d_off;              // 目录文件开头至此目录进入点的位移

  signed short int d_reclen;   // d_name 的长度, 不包含NULL 字符

  unsigned char d_type;     // d_name 所指的文件类型

  char d_name[256];            // 文件名

};

d_type的取值:

  • DT_BLK - 块设备
  • DT_CHR - 字符设备
  • DT_DIR - 目录
  • DT_LNK - 软连接
  • DT_FIFO - 管道
  • DT_REG - 普通文件
  • DT_SOCK - 套接字
  • DT_UNKNOWN - 未知

closedir函数

  • 函数描述: 关闭目录
  • 函数原型: int closedir(DIR *dirp);
  • 函数返回值: 成功返回0, 失败返回-1
  • 函数参数: opendir函数的返回值

读取目录内容的一般步骤

1 DIR *pDir = opendir(“dir”);   //打开目录

2 while((p=readdir(pDir))!=NULL){}  //循环读取文件

3 closedir(pDir);  //关闭目录

遍历指定目录下的所有文件, 并判断文件类型

 递归遍历目录下所有的文件, 并判断文件类型.

特别注意: 递归遍历指定目录下的所有文件的时候, 要过滤掉...文件, 否则会进入死循环

 dup/dup2/fcntl

 

dup函数

  • 函数描述: 复制文件描述符
  • 函数原型: int dup(int oldfd);
  • 函数参数: oldfd -要复制的文件描述符
  • 函数返回值:
    • 成功: 返回最小且没被占用的文件描述符
    • 失败: 返回-1, 设置errno值

编写程序, 测试dup函数

 

dup2函数

  • 函数描述: 复制文件描述符
  • 函数原型: int dup2(int oldfd, int newfd);
  • 函数参数:
  • oldfd-原来的文件描述符
  • newfd-复制成的新的文件描述符
  • 函数返回值:
    • 成功: 将oldfd复制给newfd, 两个文件描述符指向同一个文件
    • 失败: 返回-1, 设置errno值
  • 假设newfd已经指向了一个文件,首先close原来打开的文件,然后newfd指向oldfd指向的文件.

若newfd没有被占用,newfd指向oldfd指向的文件.

 编写程序, 测试dup2函数实现文件描述符的复制.

 编写程序, 完成终端标准输出重定向到文件中

dup2(fd, STDOUT_FILENO)将文件输出指向了fd指向的文件,输出内容将不会在控制台输出,而是输出到fd指向的文件中去

 

 fcntl函数

  • 函数描述: 改变已经打开的文件的属性
  • 函数原型: int fcntl(int fd, int cmd, ... /* arg */ );
  • 若cmd为F_DUPFD, 复制文件描述符, 与dup相同
  • 若cmd为F_GETFL, 获取文件描述符的flag属性值
  • 若cmd为 F_SETFL, 设置文件描述符的flag属性
  • 函数返回值:返回值取决于cmd
  • 成功
  • 若cmd为F_DUPFD, 返回一个新的文件描述符
  • 若cmd为F_GETFL, 返回文件描述符的flags值
  • 若cmd为 F_SETFL, 返回0
  • 失败返回-1, 并设置errno值.
  • fcntl函数常用的操作:
  • 1 复制一个新的文件描述符:
  • int newfd = fcntl(fd, F_DUPFD, 0);
  • 2 获取文件的属性标志
  • int flag = fcntl(fd, F_GETFL, 0)
  • 3 设置文件状态标志
  • flag = flag | O_APPEND;
  • fcntl(fd, F_SETFL, flag)
  • 4 常用的属性标志
  • O_APPEND-----设置文件打开为末尾添加
  • O_NONBLOCK-----设置打开的文件描述符为非阻塞

使用fcntl函数实现复制文件描述符

使用fcntl函数设置在打开的文件末尾添加内容.

fcntl可以修改flags属性 flags属性即是open函数的第三个参数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值