zoukankan      html  css  js  c++  java
  • Linux C/C++编程之(十四)文件操作相关函数

    一、概述

    在这里插入图片描述
    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
    ");
    		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
    ", 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
    ");
    		return -1;
    	}
    	if (access(argv[1], R_OK) == 0) printf("%s read ok!
    ", argv[1]);
    	if (access(argv[1], W_OK) == 0) printf("%s write ok!
    ", argv[1]);
    	if (access(argv[1], X_OK) == 0) printf("%s exe ok!
    ", argv[1]);
    	if (access(argv[1], F_OK) == 0) printf("%s file exists!
    ", 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
    ");
    		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
    ", 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
  • 相关阅读:
    记一次dba面试
    MySQL登陆 socket 问题
    推荐一些MySQL的博文(持续更新)
    MySQL 参数调优工具--tuning-primer
    当扫描的数据超过了全表的17%就不使用索引
    MySQL 5.7 新增参数
    MySQL 5.7 和 MySQL 5.6参数默认值比较
    MySQL创建的用户无法从本地登陆
    含有IN的子查询
    索引大小对语句执行速度的影响
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302536.html
Copyright © 2011-2022 走看看