# 五、文件管理
# 1. 文件的逻辑结构
# 1.1 逻辑结构的文件类型
# 有结构文件
文件内容由定长记录和可变长记录组成。
定长记录记录文件格式、文件描述等结构化数据项,可变长记录存储文件的具体内容。
- 文本文件
- 文档
- 媒体文件

# 无结构文件
也称为流式文件,文件内容长度以字节为单位。
- 二进制文件
- exe 文件
- 链接库
- dll 文件
- so 文件
# 1.2 顺序文件
按照顺序存放在存储介质中的文件。
磁带的存储特性使得磁带文件只能存储顺序文件。
顺序文件是所有逻辑文件当中存储效率最高的。
可变长文件不适合使用顺序文件格式存储。
# 1.3 索引文件
索引文件是为了解决可变长文件存储而发明的一种文件格式。
索引文件需要配合索引表完成存储的操作。

# 2. 磁盘调度算法
# [1] 先来先服务算法 FCFS
# [2] 最短寻道时间优先 SSTF
# [3] 扫描算法 SCAN
在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。因这种算法中磁头移动规律颇似电梯的运行,故又称为电梯调度算法。
特点:具有较好的寻道性能,能避免进程饥饿,但不利于两端磁道的请求。
# [4] 循环扫描 CSCAN
是SCAN算法的改良,它规定磁头单向移动。例如,自里向外移动,当磁头移到最外磁道时立即又返回到最里磁道,如此循环进行扫描。
特点:该算法消除了对两端磁道请求的不公平。
# 3. 磁盘容错技术
通过增加冗余磁盘驱动器、磁盘控制器等方法来提高磁盘系统可靠性的一种技术。
三个级别:
- 低级磁盘容错技术
- 防止磁盘表明发送缺陷而引起的数据丢失。
- 采用了双份目录和双份文件分配表、热修复重定向和写后校验等技术。
- 中级磁盘容错技术
- 防止磁盘驱动器和磁盘控制器故障,采用了磁盘映像、磁盘双工等技术。
- 高级系统容错技术
- 采用服务器镜像技术。
# 4. 文件的存储空间管理
# 4.1 文件存储空间的分配
# 连续分配
为文件分配连续的磁盘空间。
在这种分配方法中,用户必须在分配前说明待创建文件所需的存储空间大小。然后系统查找空闲区管理表格,若有就给文件分配所需的存储空间,否则文件不能建立。

特点:
- 顺序访问容易且速度快,目录中文件存储位置信息简单;
- 但容易产生碎片,需要定期对磁盘空间进行整理。
# 链接分配
# [1] 以扇区为单位的链接分配
以扇区为单位的链接分配:按文件的要求分配若干个磁盘扇区,属于同一文件的各扇区按文件记录的逻辑次序用链接指针链接起来。

特点:
- 消除碎片
- 查找麻烦
# [2] 以区段(或簇)为单位的链接分配
是连续分配和非连续分配的结合。
区段由若干个连续扇区组成,文件所属各区段可以用链接指针、索引表等方法来管理。
特点:
- 对辅存的管理效率较高
- 减少了文件访问的查寻时间
# 索引分配
在索引分配方法中,系统为每个文件分配一个索引块,索引块中存放索引表,索引表中的每个表项对应分配给文件的一个物理块。

- 直接索引地址
- 一次间接索引地址
- 多次间接索引地址

# 4.2 空闲存储空间的管理
# 空闲文件目录
文件存储设备上的一个连续空闲区可以看作一个空闲文件,又称空白文件或自由文件。
空闲文件目录方法为所有空闲文件建立一个目录,每个空闲文件在该目录中占一个表目,其中至少包括:
- 空闲区序号
- 第一个空闲块块号
- 空闲块数目等信息。

# 空闲块链
将文件存储设备上的所有空闲块链接起来,并设置一个头指针指向空闲块链的第一个物理块。
效率低。
改进方法:
将空闲块分成若干组,再用指针将组与组链接起来,将这种管理空闲块的方法称为成组链接法。成组链接法在进行空闲块的分配与回收时要比空闲块链方法节省时间。
空闲盘块的组织:将若干个空闲盘块划归一组,将每组中的所有盘块号存放在其前一组的第一个空闲盘块号指示的盘块中,而将第一组中的所有空闲盘块号放入超级块的空闲盘块号表中。

# [1] 分配

# [2] 回收

# 位示图
位示图是反映整个存储空间分配情况的数据结构。
在位示图中,每一个二进制位都对应一个物理块,当某位为1时表示该块已分配,当某位为0时表示该块空闲。

# 5. 文件系统
# 5.1 FAT
File Allocation Table。
FAT16、FAT32等,是微软 Dos/Windows 使用的文件系统。
使用一张表保存盘块的信息。
# 5.2 NTFS
New Technology File System.
WindowsNT 环境的文件系统。
NTFS 对 FAT 进行了改进,取代了旧文件系统。
# 5.3 EXT2/3/4
Extended File System。
Linux 的文件系统。
# 逻辑结构

# Block Group

[Inode table]
- 存储文件 Inode 的地方。
- 每一个文件(目录)都有一个 Inode,它是每一个文件(目录)的索引节点。
[Inode]
- 存放每个文件的元信息
- 文件类型
- 文件权限
- 文件物理地址
- 文件长度
- 文件连接计数
- 文件存取时间
- 文件状态
- 访问计数
- 链接指针
- 索引节点编号
- 文件名不是存放在 Inode 节点上的,而是存放在目录的 Inode 节点。这样列出目录文件的时候就无需加载文件的 Inode。
[Inode bitmap]
Inode 的位示图。
记录已分配的 Inode 和未分配的 Inode。
[Data block]
- 存放文件内容的地方。
- 每一个 block 都有唯一的编号。
- 文件的 block 记录在文件的 Inode 上。
[Block bitmap]
- 功能与 Inode bitmap 类似,记录 Data block 的使用情况。
[Superblock]
- 记录整个文件系统相关信息的地方。包括 Block 和 Inode 的使用情况,还有时间信息、控制信息等。
# 6. Linux 磁盘操作
# 查看磁盘分配信息 —— df -T

# 查看 Inode 信息 —— dumpe2fs 某个设备
# 查看文件信息 —— stat 文件

# 7. Linux 文件操作
# 显示当前工作目录的绝对路径 —— pwd

# 显示当前目录的信息 —— ls
-a:显示当前目录所有的文件和目录,包括隐藏的。
-l:以列表的方式显示信息。
例:查看当前目录的所有内容信息

# 切换目录 —— cd
cd ~:回到当前用户的家目录
cd ..:回到上级目录
cd [绝对路径] | [相对路径]:切换到指定路径
# 创建目录 —— mkdir
mkdir 目录 —— 创建单级目录
mkdir -p 目录 —— 创建多级目录
# 删除空目录 —— rmdir 目录

# 删除非空目录 —— rm -rf 目录

# 创建空文件 —— touch 文件名

# 拷贝文件 —— cp [选项] 原路径 目标路径
将当前目录下的 newFile.txt 文件拷贝到当前目录下的 newDir 目录下:


-r:递归复制整个文件
# 删除文件或目录 —— rm
- rm 文件名:删除文件

-r:递归删除整个文件夹
-f:强制删除不提示
# 移动文件与目录或重命名 —— mv
mv 旧文件名 新文件名 —— 重命名
mv 原路径 新路径
# 以只读模式查看文件 —— cat 文件名
- cat 文件名:查看文件内容

-n:显示行号
cat 文件名 | more:分页显示
# more 指令
more 指令是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。

# less 指令
less 指令用来分屏查看文件内容,它的功能与 more 指令类似,但是比 more 指令更加强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。


# 输出重定向(覆盖)—— >
ls -l > 文件名:列表的内容写入文件中,覆盖写
cat 文件1 > 文件2:将文件1的内容覆盖到文件2中
# 追加 —— >>
cat 文件1 >> 文件2:将文件1的内容追加在文件2后面
# 输出内容到控制台 —— echo
echo $PATH:输出当前环境变量
# 显示文件的开头部分内容 —— head
head 文件名:默认输出文件的前10行
head -n 行数 文件名:输出文件的头n行
# 显示文件的末尾部分内容 —— tail
tail 文件:默认查看文件后 10 行
tail -n 行数 文件:显示文件的后n行
tail -f 文件:实时追踪该文档的所有更新(重点)
# 创建软连接(类比快捷方式)—— ln -s 原文件或目录 软连接名

# 删除软连接 —— rm -rf 软连接名
不要写 rm-rf linkToRoot/

# 查看已经执行过历史命令或执行历史指令 —— history
history:查看已经执行过的历史指令
history 数字:显示最近使用过的 n 个指令。
!n:执行第 n 个历史指令