一 文件存储相关概念,这和后面函数学习息息相关。
inode
前面我们学习过 使用 stat a.txt 去查看一个文件的属性,可以看到每个文件都一个Inode,从内容来看,像是一个 int,实际其本质为结构体
hunandede@hunandede-virtual-machine:~/projects/linuxcpp$ stat main.cpp
File: 'main.cpp'
Size: 6428 Blocks: 16 IO Block: 4096 regular file
Device: 801h/2049d Inode: 665076 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/hunandede) Gid: ( 1000/hunandede)
Access: 2024-02-24 12:44:27.250263847 +0800
Modify: 2024-02-24 12:44:26.662256231 +0800
Change: 2024-02-24 12:44:26.662256231 +0800
Birth: -
其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置……也叫作文件属性管理结构,大多数的inode都存储在磁盘上。
少量常用、近期使用的inode会被缓存到内存中。
dentry
目录项,其本质依然是结构体,重要成员变量有两个 {文件名,inode,...},而文件内容(data)保存在磁盘盘块中。
当我们增加 或者减少一个 "硬链接" 的时候,实际上就是 增加一个 dentry 或者减少一个 dentry
注意 :当我们的dentry 被删除完毕后,磁盘上的区域并不会擦除。
即使是单纯的初始化也没有用。
那应该怎么擦除这些信息呢?把磁盘的这块区域重新写一遍就OK了,怎么知道是这块区域呢?
当然肯定有确定的办法, 但是还有笨办法,将你的磁盘重新写满,拷贝300集的 圣斗士星矢。
这就是 艳照门 事件 照片恢复的原理。
二 文件操作 stat函数 和 lstat 函数
lstat 不会穿透链接,意思是如果我们的文件是 软链接,使用 stat 函数获得的mode和 S_ISLNK宏函数 &,得到的不是 软链接,因为 stat函数 获得struct stat 中的mode 会指向软链接指向的真正的文件类型,但是lstat 不会。这个在后面有例子可以看出,这一行是学习到这个函数最后的时候的整理出来的,为了方便看,才提取到第一行,理论上应该放在最后一行。
函数原型:
获取文件属性,(从inode结构体中获取)
int stat(const char *path, struct stat *buf); 成返回0;失败返回-1 设置errno为恰当值。
参数:
参数1:文件名,文件路径
参数2:inode结构体指针 (传出参数),函数调用完毕后,会将file stat信息存在这个struct中
文件属性将通过传出参数返回给调用者。
返回值:
成功,返回0
失败,返回-1,errno被设置
stat 结构体的样子
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner