Linux CC++编程之(十四)文件操作相关函数

    技术2022-07-10  89

    文章目录

    一、概述二、相关函数1. stat2. access3. chmod4. truncate5. link6. symlink7. readlink8. unlink9. chown10. rename

    一、概述

    st_mode简单介绍 st_mode详细介绍

    二、相关函数

    1. stat

    作用:获得文件信息,也可以获取文件大小。头文件: 参数说明: path 文件名buf 传出参数,定义结构体 struct stat sb; &sb 返回值 失败:返回 -1,设置 errno成功:返回 0

    注意: stat 碰到链接,会追溯到源文件,穿透!!!lstat 并不会穿透。

    stat结构体: linux 命令 stat 执行结果: 注意三个时间的区别:

    time_t st_atime;/* time of last access */ 文件被读,比如cat,open读等 time_t st_mtime;/* time of last modification */ 文件内容发生改变 time_t st_ctime;/* time of last status change */文件属性发生变化,比如大小,权限,硬连接数等

    需求:使用stat实现实现 ls -l 的功能? 在实现的过程中需要获取用户名及组名,因此先看两个函数:

    1)getpwuid

    作用:通过用户的uid获取用户名头文件 参数说明:uid用户的uid

    返回值

    失败:返回NULL成功:返回 struct passwd * 结构体指针

    2)getgrgid

    作用:通过用户的gid获取用户组名头文件

    参数说明:

    gid用户组的gid

    返回值

    失败:返回NULL成功:返回 struct group * 结构体指针

    3)localtime

    作用:获取本地时间头文件

    参数说明:

    timep:一个时间相关的结构体

    返回值

    失败:返回NULL成功:返回 struct tm * 结构体指针

    传入参数 timep 对应stat函数得到的结构体的秒数(time_t类型)。

    最终实现:

    #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<time.h> #include <grp.h> #include <pwd.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("./a.out filename\n"); return -1; } struct stat sb; stat(argv[1], &sb); char stmode[11] = {0}; memset(stmode, '-', sizeof(stmode)-1); //解析文件属性 if (S_ISREG(sb.st_mode)) stmode[0] = '-'; //普通文件 if (S_ISDIR(sb.st_mode)) stmode[0] = 'd'; if (S_ISCHR(sb.st_mode)) stmode[0] = 'c'; if (S_ISBLK(sb.st_mode)) stmode[0] = 'b'; if (S_ISFIFO(sb.st_mode)) stmode[0] = 'p'; if (S_ISLNK(sb.st_mode)) stmode[0] = 'l'; if (S_ISSOCK(sb.st_mode)) stmode[0] = 's'; //解析权限 //user if (sb.st_mode & S_IRUSR) stmode[1] = 'r'; if (sb.st_mode & S_IWUSR) stmode[2] = 'w'; if (sb.st_mode & S_IXUSR) stmode[3] = 'x'; //group if (sb.st_mode & S_IRGRP) stmode[4] = 'r'; if (sb.st_mode & S_IWGRP) stmode[5] = 'w'; if (sb.st_mode & S_IXGRP) stmode[6] = 'x'; //other if (sb.st_mode & S_IROTH) stmode[7] = 'r'; if (sb.st_mode & S_IWOTH) stmode[9] = 'w'; if (sb.st_mode & S_IXOTH) stmode[10] = 'x'; //分析 用户名,组名可以通过函数获得 getpwuid, getgrgid //时间获取 struct tm *filetm = localtime(&sb.st_atim.tv_sec); char timebuf[20] = {0}; sprintf(timebuf, "%d月 %d d:d", filetm->tm_mon+1, filetm->tm_mday, filetm->tm_hour, filetm->tm_min); printf("%s %ld %s %s %ld %s %s\n", stmode, sb.st_nlink, getpwuid(sb.st_uid)->pw_name, getgrgid(sb.st_gid)->gr_name, sb.st_size, timebuf, argv[1]); return 0; }

    2. access

    作用:测试指定文件是否有某种权限头文件 参数说明:pathname文件名mode: R_OKW_OKX_OKF_OK

    返回值

    失败:返回-1,设置errno成功:如果有权限或者文件存在,对应返回0 #include<stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("./a.out filename\n"); return -1; } if (access(argv[1], R_OK) == 0) printf("%s read ok!\n", argv[1]); if (access(argv[1], W_OK) == 0) printf("%s write ok!\n", argv[1]); if (access(argv[1], X_OK) == 0) printf("%s exe ok!\n", argv[1]); if (access(argv[1], F_OK) == 0) printf("%s file exists!\n", argv[1]); return 0; }

    3. chmod

    4. truncate

    函数作用:截断文件头文件

    参数说明:

    path文件名length长度,长度如果大于原文件,直接拓展,如果小于原文件,截断为length长度。

    返回值

    成功:返回0失败:返回-1,设置errno

    5. link

    函数作用:创建硬连接头文件

    参数说明:

    oldpath原文件newpath硬连接文件

    返回值

    成功:返回0失败:返回-1,设置errno

    6. symlink

    函数作用:创建软连接头文件

    参数解释:

    oldpath原文件newpath创建软连接文件

    返回值

    成功:返回0失败:返回-1,设置errno

    7. readlink

    函数作用:读取文件链接信息头文件

    参数解释:

    path链接名buf缓冲区bufsiz缓冲区大小

    返回值

    成功:返回buf填充的大小失败:返回-1,设置errno

    8. unlink

    函数作用:删除软硬链接头文件

    函数参数:

    pathname 链接名,文件也可以

    返回值

    成功:返回0失败:返回-1,设置errno

    #include<stdio.h> #include <unistd.h> #include<stdlib.h> #include<fcntl.h> #include<string.h> #include<sys/types.h> int main(int argc, char *argv[]) { if (argc != 2) { printf("./a.out filename\n"); return -1; } int fd = open(argv[1], O_WRONLY|O_CREAT, 0666); //注意只要有进程在使用该文件,则unlink在该文件退出时删除该文件 unlink(argv[1]); int ret = write(fd, "hello", 5); if (ret > 0) { printf("write ok! %d\n", ret); } if (ret < 0) { perror("write err"); } close(fd); return 0; }

    9. chown

    函数作用:修改文件属主及属组头文件

    函数参数:

    path文件名owner用户ID,/etc/passwdowner组ID,/etc/group

    返回值

    成功:返回0失败:返回-1,设置errno

    10. rename

    函数作用:文件或者目录重命名头文件

    参数说明:

    oldpath文件名newpath文件新名

    返回值

    成功:返回0失败:返回-1,设置errno 我是管小亮 认证博客专家 TensorFlow PyTorch 图像处理 纸上得来终觉浅,绝知此事要躬行包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
    Processed: 0.023, SQL: 9