# 文件管理


<!--more-->

## 文件的逻辑结构

```mermaid
mindmap
  root((文件的逻辑结构))
    无结构文件--流式文件
    有结构文件--定长/变长
      顺序文件
      索引文件
      索引顺序文件
      直接文件-散列文件
```
## 文件控制块FCB
>[!note]文件控制块FCB
>一个文件对应一个FCB,其中包括文件的基本信息(**文件位置,逻辑/物理结构**),存取控制信息,使用信息等
>
>FCB的集合构成目录文件
>>[!tip]理解索引节点
>>传统FCB目录占用大量空间,查找也不方便,为此Unix等系统采用文件名与FCB分离,即将某个**FCB独立为索引节点(inode节点)**
>>
>>而目录精简结构为<文件名,inode编号>
>>
>>索引节点有两种形态:磁盘上为[磁盘索引节点]调入内存后-->添加额外信息转化为[内存索引节点]

---
{.awesome-hr}

## 文件的物理结构
```mermaid
mindmap
  root((文件的物理结构))
    连续分配
    链接分配
      隐式链接
      显式链接-通过FAT分配表
    索引分配
      单级索引
      多级索引
      混合索引

```
### 混合索引

inode采用混合索引

![文件管理-i41pmg1](/images/文件管理-i41pmg1.png)

---
{.awesome-hr}

## 创建文件

{{< timeline animation=true placement=top >}}
events:
  - timestamp: "阶段 01：检验"
    content: |
      检查文件名,权限
  - timestamp: "阶段 02：分配索引节点"
    content: |
      从空闲的inode区域中分配一个空闲块,初始化元数据,标记为已占用
  - timestamp: "阶段 03：分配磁盘块"
    content: |
      分配后将地址记录在inode中
  - timestamp: "阶段 04：新建目录项"
    content: |
      <文件名,索引节点编号>
  - timestamp: "阶段 05：更新文件系统数据"
    content: |
      空闲inode表数据,空闲磁盘数据,目录大小,修改时间等
  - timestamp: "阶段 06：打开并返回文件描述符"
    content: |
      可选

{{< /timeline >}}

---
{.awesome-hr}


## 删除文件


{{< timeline animation=true placement=top >}}
events:
  - timestamp: "阶段 01：获取inode"
    content: |
  - timestamp: "阶段 02：检查使用状态和硬链接计数"
    content: |
  - timestamp: "阶段 03：移除目录中的目录项"
    content: |
  - timestamp: "阶段 04：释放inode"
    content: |
  - timestamp: "阶段 05：释放磁盘块"
    content: |
  - timestamp: "阶段 06：释放内存资源,更新元数据"
    content: |
      

{{< /timeline >}}

---
{.awesome-hr}


## 文件的打开与关闭

>[!tip]现代操作系统多采用两级打开文件表:
>系统打开文件表:全局共享,文件属性,位置,大小,打开计数
>
>进程打开文件表:每个进程独有,每一项都指向系统打开文件表的某一项
>
>打开过程的最后一步将进程打开文件表某项的索引号作为**文件描述符**返回给用户


>[!NOTE]文件名不是打开文件表的组成部分
>一旦系统通过文件名完成对FCB的定位,后续便不再使用文件名,而是文件描述符



## 文件共享

>[!abstract]两种方式
>硬链接基于索引节点
>
>软连接基于Link文件,Link文件里记录了某文件的路径

---

> 作者: 房子  
> URL: https://fzcy.net/posts/%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/  

