• 周六. 10 月 12th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

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

King Wang

1 月 3, 2022

文章目录

    • 一、概述
    • 二、相关函数
      • 1. stat
      • 2. access
      • 3. chmod
      • 4. truncate
      • 5. link
      • 6. symlink
      • 7. readlink
      • 8. unlink
      • 9. chown
      • 10. 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 %02d:%02d", 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_OK
    • W_OK
    • X_OK
    • F_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/passwd
  • owner组ID,/etc/group

返回值

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

10. rename

  • 函数作用:文件或者目录重命名
  • 头文件
    在这里插入图片描述

参数说明:

  • oldpath文件名
  • newpath文件新名

返回值

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

发表回复