文章目录

  • 一、概述
  • 二、相关函数
    • 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';//解析权限//userif (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';//groupif (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';//otherif (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

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

  1. Linux攻关之基础模块十四 文件查找

    文件查找 在文件系统上查找符合条件的文件实现工具:locate find 1.locate 依赖于事先构建好的索引库系统自动实现(周期性任务)手动更新数据库(updatedb)工作特性查找速度快模糊查 ...

  2. Linux的基本学习(十四)——进程管理(下)与SELinux

    Linux的基本学习(十四)--进程管理(下)与SELinux 前言 进程这部分内容真是不少,来,我们继续跟着鸟哥学习. 特殊文件与进程 具有SUID/SGID权限的命令执行状态 SUID的权限其实与 ...

  3. JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快!

    JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快! 一.ReentrantReadWriteLock(读写锁) 1.读写锁存在 ...

  4. CSDN 编程竞赛十四期题解

    竞赛总览 CSDN编程竞赛十四期:比赛详情 (csdn.net) 本次竞赛题目难度适中,并且题目的解法(思路)也比较多,很适合新人学习. 竞赛题解 题目1.字符串全排列 对K个不同字符的全排列组成的数 ...

  5. 十、文件操作(易懂易学习,附代码案例)

    十.文件操作 10.1 概述 10.1.1 文件分类 10.1.2 磁盘文件的分类 10.2 文件的打开和关闭 10.2.1 文件指针FILE 10.2.2 文件的打开 10.2.3 文件的关闭 10 ...

  6. 零基础学lua第十天---文件操作

    零基础学lua第十天-文件操作 一.前言 每个编程语言和都少不了对文件操作,lua中操作文件的方法非常简单,而且文件和输入输出操作都是使用的同一个库,可以说是相当方便了,下面我们来看下吧. 二.读取文 ...

  7. Linux的简单shell脚本中修改文件操作

    Linux的简单shell脚本中修改文件操作 Linux Shell常用技巧(三) sed 八.流编辑器sed 8.1 sed简介 sed是stream editor的缩写,一种流编辑器,它一次处理一 ...

  8. 鸟哥的Linux私房菜(服务器)- 第十四章、账号控管: NIS 服务器

    第十四章.账号控管: NIS 服务器 最近更新日期:2011/07/28 有没有想过,如果我有十部 Linux 主机,这十部主机仅负责不同的功能,事实上,所有的主机账号与对应的密码都相同! 那么我是将 ...

  9. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...

    第十四章 设计Shell集成应用 有一些工具可以使应用程序更紧密地与Shell和底层系统进行集成.也就是说,用户可以象处理系统文档和程序那样处理你的文档和程序.例如,右击文件来显示可用功能列表等.Wi ...

  10. linux系统无法启动 备份恢复,Linux运维 第二阶段 (十四) 备份与恢复及常见故障排除...

    Linux运维 第二阶段 (十四) 备份与恢复 常见的系统故障排除(经常备份源文件,尽量借助于工具): 1.确定问题的故障特征 2.重现故障 3.使用工具收集进一步信息 4.排除不可能的原因 5.定位 ...

最新文章

  1. g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!
  2. POJ 3982 序列 塔尔苏斯问题解决
  3. C语言基础:数组作为函数参数传递演示源码
  4. 20180530更新
  5. 在GridView中的批量删除!
  6. 2019厦门科技中学计算机特长,中考快讯 | 2019厦门市高中特长生招生学校名单出炉!...
  7. 17电大计算机网考模拟题,2017年电大 201717统考电大计算机应用基础网考试题.doc...
  8. 小屏幕 ui设计_UI设计基础:屏幕
  9. java与android https,java – Https连接Android
  10. 关于C/C++中的“auto”关键字
  11. CentOS忘记普通用户密码解决办法
  12. CSDN博客如何在有序序列中缩进代码段或图片
  13. leetcode 1184 python
  14. 易语言版{大智慧/分析家/飞狐交易师}DLL插件接口开发模块(beta),自定义股票软件公式扩展函数...
  15. 融合迁移学习与文本增强的中文成语隐喻知识识别与关联研究
  16. 方便!Python 操作 Excel 神器 xlsxwriter 初识!
  17. mc全国计算机一级考试,全国计算机等级考试一级模拟试题04
  18. Account locked due to 10 failed logins
  19. COOC+VOSviewer可取代任何文献计量与知识图谱软件
  20. python基础项目实战-简易文本编辑器

热门文章

  1. 影楼——Lr基础操作PS动作及批处理
  2. 单方差分析MATLAB,MATLAB单因素方差分析.PDF
  3. Java+HTML预习笔记_20140610
  4. i春秋 - Exploit-Exercises: Nebula - level03
  5. 一个多重阴影的DIV框框
  6. HDU 1429 bfs 状态压缩
  7. python sklearn包中的主成分分析_九、Sklearn主成分分析
  8. 有哲理有关java的_从Java到“浑沌之死”再到人生哲理
  9. 线下综合体-中岛店的一些思考
  10. Java 求阴历(C++ 求阴历方法的转换)