3 文件和目录

news2024/9/21 12:37:09

3.1 stat、fstat、lstat 函数

#include <sys/types.h>
#include <sys/stat.h>

//三个函数的返回:若成功则为 0,若出错则为-1
int stat(const char *pathname, struct stat *buf) ;
int fstat(int filedes,struct stat * buf) ;
int lstat(const char *pathname, struct stat * buf) ;

        给定一个pathname,stat函数返回一个与此命名文件有关的信息结构, fstat函数获得已在描述符filedes上打开的文件的有关信息。lstat函数类似于stat,但是当命名的文件是一个符号连接时, lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

struct stat 
{
    mode_t  st_mode;      /* file type & mode(permissions) */
    ino_t   st_ino;       /* i-node number (serial number) */
    dev_t   st_dev;       /* device number (filesystem) */
    dev_t   st_rdev;      /* device number for special files */
    nlink_t st_nlink      /* number of links */
    uid_t   st_uid;       /* user id of owner */
    gid_t   st_gid;       /* group id of owner */
    off_t   st_size;      /* size in bytes, for regular files */
    time_t  st_atime;     /* time of last access */
    time_t  st_mtime;     /* time of last modification */
    time_t  st_ctime;     /* timer of last file status change */
    long    st_blksize;   /* best I/O block size */
    long    st_blocks;    /* number of 512-byte block allocated */
}

3.2 文件类型

(1)普通文件(regular file)。这是最常见的文件类型,这种文件包含了某种形式的数据。

(2)目录文件(directory file)。这种文件包含了其他文件的名字以及指向与这些文件有关信 息的指针。对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。

(3)字符特殊文件(character special file)。这种文件用于系统中某些类型的设备。

(4)块特殊文件(block special file)。这种文件典型地用于磁盘设备。系统中的所有设备或者 是字符特殊文件,或者是块特殊文件。

(5)FIFO。这种文件用于进程间的通信,有时也将其称为命名管道。

(6)套接字(socket )。这种文件用于进程间的网络通信。套接口也可用于在一台宿主机上的 进程之间的非网络通信。

(7)符号连接(symbolic link)。这种文件指向另一个文件。

宏确定文件类型:

<sys/stat.h>中的文件类型宏
文件类型
S_ISREG()普通文件
S_ISDIR()目录文件
S_ISCHR()字符特殊文件
S_ISBLK()块特殊文件
S_ISFIFO()管道或FIFO
S_ISLNK()符号连接
S_ISSOCK()套接字

3.3 文件存储许可权

        st_mode值也包含了对文件的存取许可权位。每个文件有9个存取许可权位,可将它们分成三类:

来源于<sys/stat.h>
st_mode屏蔽意 义
S_IRUSR用户-读
S_IWUSR用户-写
S_IXUSR用户-执行
S_IRGRP组-读
S_IWGRP组-写
S_IXGRP组-执行
S_IROTH其他-读
S_IWOTH其他-写
S_IXOTH其他-执行

3.4 access函数

        access函数是按实际用户ID和实际组ID进行存取许可权测试的。

#include <unistd.h>

//返回:若成功则为0,若出错则为-1
int access(const char *pathname, int mode) ;

其中,mode是表中所列常数的逐位或运算。

access函数的mode常数,取自<unistd.h>
mode说 明
R_OK测试读许可权
W_OK测试写许可权
X_OK测试执行许可权
F_OK测试文件是否存在

3.5 umask函数

        umask函数为进程设置文件方式创建屏蔽字,并返回以前的值。

#include <sys/types.h>
#include <sys/stat.h>

//返回:以前的文件方式创建屏蔽字
mode_t umask(mode_t cmask) ;

3.6 chmod和fchmod函数

        这两个函数使我们可以更改现存文件的存取许可权。

#include <sys/types.h>
#include <sys/stat.h>

//两个函数返回:若成功则为0,若出错则为-1
int chmod(const char * pathname, mode_t mode) ;
int fchmod(int filedes, mode_t mode) ;

chmod函数在指定的文件上进行操作,而fchmod函数则对已打开的文件进行操作。

3.7 chown, fchown和lchown函数

        chown函数可用于更改文件的用户ID和组ID.

#include <sys/types.h>
#include <unistd.h>

//三个函数返回:若成功则为 0,若出错则为-1
int chown(const char *pathname, uid_t owner, gid_t group) ;
int fchown(int filedes, uid_t owner, gid_t group) ;
int lchown(const char *pathname, uid_t owner, gid_t group) ;

除了所引用的文件是符号连接以外,这三个函数的操作相类似。在符号连接情况下, lchown更 改符号连接本身的所有者,而不是该符号连接所指向的文件。

3.8 文件长度

        stat结构的成员st_size包含了以字节为单位的该文件的长度。此字段只对普通文件、目录文件和符号连接有意义。

        对于普通文件,其文件长度可以是0,在读这种文件时,将得到文件结束指示。

        对于目录,文件长度通常是一个数,例如16或512的整倍数。

        对于符号连接,文件长度是在文件名中的实际字节数。

3.9 文件截短

        有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截短为0是一个 特例,用O_TRUNC标志可以做到这一点。为了截短文件可以调用函数 truncate和ftruncate。

#include <sys/types.h>
#include <unistd.h>

//两个函数返回;若成功则为 0,若出错则为-1
int truncate(const char *pathname, off_t length) ;
int ftruncate(int filedes, off_t length) ;

        这两个函数将由路径名 pathname或打开文件描述符 filedes指定的一个现存文件的长度截短为 length。如果该文件以前的长度大于 length,则超过length以外的数据就不再能存取。如果以前的长度短于length,则其后果与系统有关。如果某个实现的处理是扩展该文件,则在以前的文件尾端和新的文件尾端之间的数据将读作0。

3.10 文件系统

        可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统。

 i节点是固定长度的记录项,它包含有关文件的信息。

        如果在忽略自举块和超级块情况下更仔细地观察文件系统,则可以得到下图中所示的情况。

 3.11 link,unlink,remove和rename函数

        任何一个文件可以有多个目录项指向其 i节点。创建一个向现存文件连接的方法是使用link函数。

#include <unistd.h>

//返回:若成功则为0,若出错则为-1
int link(const char *existingpath, const char * newpath) ;

此函数创建一个新目录项newpath,它引用现存文件existingpath。如若newpath已经存在,则返 回出错。

        为了删除一个现存的目录项,可以调用unlink函数。

#include <unistd.h>

//返回:若成功则为0,若出错则为-1
int unlink(const char *pathname) ;

此函数删除目录项,并将由pathname所引用的文件的连接计数减1。如果该文件还有其他连接, 则仍可通过其他连接存取该文件的数据。如果出错,则不对该文件作任何更改。

        可以用 remove函数解除对一个文件或目录的连接。对于文件, remove的功能与 unlink相同。对于目录,remove的功能与rmdir相同。

#include <stdio.h>

//返回:若成功则为0,若出错则为-1
int remove(const char *pathname) ;

        文件或目录用rename函数更名。

#include <stdio.h>

//返回:若成功则为0,若出错则为-1
int rename(const char * oldname, const char * newname) ;

3.12 符号链接

        符号连接是对一个文件的间接指针,它与上一节所述的硬连接有所不同,硬连接直接指向文件和目录的i节点。引进符号连接的原因是为了避免硬连接的一些限制:

  1. 硬连接通常要求连接和 文件位于同一文件系统中。
  2. 只有超级用户才能创建到目录的硬连接。对符号连接以及它指 向什么没有文件系统限制,任何用户都可创建指向目录的符号连接。符号连接一般用于将一个 文件或整个目录结构移到系统中其他某个位置。

3.13 symlink和readlink函数

        symlink函数创建一个符号连接。

#include <unistd.h>

//返回:若成功则为0,若出错则为-1
int symlink(const char * actualpath, const char * sympath) ;

        readlink函数提供了一种方法打开该连接本身,并读该连接中的名字。

#include <unistd.h>

//返回:若成功则为读的字节数,若出错则为- 1
int readlink(const char * pathname, char * buf, int bufsize) ;

3.14 文件的时间

        每个文件保持有三个时间字段。

每个文件相关的三个时间值
字段说 明例 子ls ( 1 )选择项
st_atime文件数据的最后存取时间r e ad- u
st_mtime文件数据的最后修改时间w r i te缺省
st_ctimei节点状态的最后更改时间chmod, chown

3.15 utime函数

        一个文件的存取和修改时间可以用utime函数更改。

#include <sys/types.h>
#include <utime.h>

//返回:若成功则为0,若出错则为-1
int utime(const char * pathname, const struct utimbuf * times) ;

此函数所使用的结构是:

struct utimbuf {
time_t actime; /*access time*/
time_t modtime; /*modification time*/
}

3.16 mkdir和rmdir函数

        用mkdir函数创建目录,用rmdir函数删除目录。

#include <sys/types.h>
#include <sys/stat.h>

//返回:若成功则为0,若出错则为-1
int mkdir(const char * pathname, mode_t mode) ;

//返回:若成功则为0,若出错则为- 
int rmdir(const char * pathname) ;

3.17 读目录

#include <sys/types.h>
#include <dirent.h>

//返回:若成功则为指针,若出错则为NULL
DIR *opendir(const char * pathname) ;

//返回:若成功则为指针,若在目录尾或出错则为NULL
struct dirent *readdir(DIR * dp) ;

void rewinddir(DIR * dp) ;

//返回:若成功则为0,若出错则为-1
int closedir(DIR * dp) ;

定义在头文件<dirent.h>中的dirent结构与实现有关。这个结构至少包含 下列两个成员:

struct dirent {
ino_t d_ino; /*i-node number*/
char d_name[NAME_MAX + 1]; /*null-terminated filename*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

目录 前言 基本介绍 Sqlite 对比 MySQL 字段类型 语法 创建表 插入数据 更新数据 查询数据 删除数据 查看建表语句 Sqlite-JDBC 嵌入到Java程序 前言 最近在用JavaFX做一个桌面软件需要用到数据库&#xff0c;但MySQL这种数据库明显只能本地访问&#xff0c;把软…

gdb server简单探索

前言 gdb server运行于嵌入式设备&#xff0c;比如arm或arm64体系结构&#xff0c;体积小&#xff0c;占用资源少&#xff0c;相当于一个前端。gdb server可以attach到一个strip的进程。 gdb运行于性能更高的主机&#xff0c;如x86设备上&#xff0c;需要有带符号表的相应进程…

【IPv6】基本概念及字段

IPV4知识点&#xff1a; 字段值 IPv4字段共 字段值解释Version版本版本字段&#xff0c;可以区分V4和V6版本&#xff0c;V4是0100&#xff0c;V6是0110&#xff0c;需要注意的是V4和V6头部除了版本字段位置相同外&#xff0c;其他都是不一样的&#xff0c;因此两个协议不能直…

如何编写高质量代码

如何编写高质量代码 1. 前言2. 明确业务场景和用户需求3. 编程实践技巧3.1 提高命名规范3.2 保持代码简洁3.3 好的注释 4. 软件测试5. 总结 1. 前言 现代软件开发中&#xff0c;代码是构建高质量软件的核心。高质量代码能够提高软件系统的可靠性、可维护性和可扩展性&#xff…

3.3 动态存储随机存储器

学习目标&#xff1a; 理解动态随机存取存储器的基本原理和工作机制。掌握动态随机存取存储器的读写操作及时序。理解动态随机存取存储器的存储单元结构和电路设计。熟悉动态随机存取存储器的刷新技术及其影响因素。理解动态随机存取存储器与静态随机存取存储器的异同。掌握动态…

2008-2019年主要城市PITI指数

2008-2019年主要城市PITI指数 1、来源&#xff1a;附在文件内 2、时间区间&#xff1a;2008-2019年 3、具体时间分布&#xff1a;、2008、2009-2010、2011、2012、2013-2014、2014-2015、2015-2016、2016-2017、2017-2018、2018-2019、 4、范围&#xff1a;包括110个城市&a…

Runtime Data Area(运行时数据区域)

运行时数据区是JVM用来管理和存储Java程序执行过程中所需要的各种数据的区域&#xff0c;也成为JVM内存结构。JVM内存结构主要包括以下几个部分&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09; 程序计数器是一种特殊的内存区域&#xff0c;它可以在…

线索二叉树(前中后序线索化/遍历/画线索)

线索二叉树 文章目录 线索二叉树1 线索二叉树的基本概念2 线索二叉树的构造2.1 线索二叉树的存储结构2.2 给线索二叉树画线索2.2.1 中序2.2.2 先序2.2.3 后序 2.3 二叉树线索化代码实现2.3.1 通过中序遍历线索化2.3.2 通过先序遍历线索化2.3.3 通过后序遍历线索化 3 线索二叉树…

五一欢乐赛!题解

前言 有点一言难尽, 这次本来想的给大火减减压放了很多区域赛和省赛的签到题(还有一些是写过的题), 没想到打的并不是很理想, 还用了分数值想减少一些差距, 结果看起来好像让差距更大了, 尴尬 A题 Frozen Scoreboard https://codeforces.com/gym/104076/problem/D 济南站的中…

【MST+离线】ABC235 E - MST + 1

一开始想的是分类讨论&#xff0c;看那条边加了之后成不成环&#xff0c;如果不成环且权值在前n-1&#xff0c;则一定在MST里&#xff0c;不在前n-1则不在MST里&#xff1b;如果成环了&#xff0c;如果权值不在前n-1&#xff0c;则不在MST里&#xff0c;如果权值在前n-1&#x…

InstructGPT怎么准备和标记数据集

目录 1. 谁标记数据集 2. 数据集的来源 3.数据预处理 4. 标记数据集的方法 5. 数据多样性 6. 这样标记的数据的不足之处 名词解释 1. 谁标记数据集 OpenAI 公司在Upwork平台上和Scale AI公司聘请了大约 40 名承包商为他们标记数据&#xff0c;通过筛选测试(screening tes…

ros基础笔记

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

【C++】string类常用接口

目录 一、string类二、string类的常用接口1.string类对象的常见构造2.string类对象的容量操作3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类非成员函数6.vs和g下string结构的说明 一、string类 STL的六大组件&#xff1a; 字符串是表示字符序列的类标准…

E. Train Hard, Win Easy(数学推导 + 前缀和)

Problem - E - Codeforces 这是一个有关竞赛编程的问题。Zibi 是一名竞赛编程教练&#xff0c;有 n 名选手想要备战。培训比赛具有一些不同寻常的规则——每个团队有两名成员和两个问题&#xff0c;每个选手都会编写其中一个问题的代码。当然&#xff0c;一个团队中的人将编写不…

ViveNAS - 一个基于LSM tree的文件存储实现 (一)

1. ViveNAS &#xff08;GitHub - cocalele/ViveNAS&#xff09; ViveNAS 是一个开源分布式的网络文件系统&#xff08;NAS&#xff09;, 具有下面的特点: - 通过不同存储介质的结合&#xff0c;在高性能、低成本间寻找动态的平衡 - 解决数据的长期、低成本存储问题&#xff…

JVM-0428

执行引擎 执行引擎做什么的 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引…

java基础入门-03

Java基础入门-03 10、字符串10.1.API10.1.1API概述10.1.2如何使用API帮助文档 10.2.String类10.2.1 String类概述10.2.2 String类的特点10.2.3 String类的构造方法10.2.4 创建字符串对象两种方式的区别10.2.5 字符串的比较10.2.5.1 号的作用10.2.5.2 equals方法的作用 10.2.6 用…

java web会话管理

在人机交互过程中&#xff0c;会话管理是指保持用户的整个会话活动的交互与计算机系统跟踪的过程。会话管理分为桌面会话管理、浏览器会话管理、Web会话管理。本书讨论的是Web会话管理(通常指的是session以及Cookie) &#xff0c; 也称为会话跟踪。 会话管理基本原理 使用隐藏…

机器学习笔记 图像特征提取器(卷积变体)的技术发展与演变

一、图像特征提取器简述 图像特征提取器是可用于从图像中学习表示的函数或模块。最常见的特征提取器类型是卷积,其中内核在图像上滑动,允许参数共享和平移不变性。 在深度学习技术的快速发展过程中,基于卷积也演变出来了若干新技术由于图像特征的提取,这里进行了一下简单梳…

[oeasy]python0145_版本控制_git_备份还原

git版本控制 回忆上次内容 上次我们了解了 try 的完全体 try 尝试运行 except 发现异常时运行的代码块 else 没有发现异常时运行的代码块 finally 无论是否发现异常最终都要运行的代码块 发现导入部分 可以再分为两个子模块一个输入 a一个输入 b 可以再拆分么&#xff1f;&…