Musha 告诉你,也许你会觉得这个题目挺复杂,但事实上,期末考试最后一题可能难度更大,能够顺利完成的同学少之又少。所以不要气馁,也不要轻言放弃,Musha 相信你一定可以的!Musha 还想提醒你,本题的输入解析并不困难,但曾经考过连读入部分都需要递归处理的压轴题(对,就是去年,你可以网上搜一搜),所以不可忽视。
Musha 在完成操作系统挑战性任务时,自己捣鼓出了一个文件系统,虽然和 Fat32 没有任何关系,但是依然取名为 Fat Musha,她想向你安利一下这个文件系统。
和我们平时使用的一样,从根目录开始,形成一个树状结构。树的节点可以为以下三种类型:
- 文件夹(目录):可以有任意类型的子节点,也可以没有。根目录也是文件夹类型,为整个树状结构的根节点。
- 常规文件:只能为叶子节点。
- 硬链接:可以指向任意一个非硬链接节点。
硬链接
下面对硬链接进行解释。硬链接可以指向一个常规文件或者文件夹。
若硬链接指向一个常规文件,则可以通过硬链接访问、修改目标文件,直接对目标文件的修改也会在硬链接处同步。比如,硬链接 hard.lnk
指向文件 test.txt
,我们可以通过 hard.lnk
修改 test.txt
的内容,再通过 test.txt
读取。
若硬链接指向一个文件夹,则我们也可以通过硬链接去直接访问、修改目标文件夹以及其子文件、子文件夹、子硬链接。比如,硬链接 fold.lnk
指向文件夹 hello
,其中有文件 world
,则 fold.lnk/world
与 hello/world
为同一个文件。对他们的修改也是相互同步的。
对于任何硬链接,若其指向一个文件夹,则保证从该硬链接指向的文件夹的子节点开始,不存在任何路径,能够再次访问到该硬链接。比如硬链接 l1.lnk
位于文件夹 fold
中,l1.lnk
不能指向 fold
。这样,你在遍历时,不用考虑成环的问题。
下面说到,本题中的各种东西的名字仅由小写字母组成,你不用考虑有 .
或其他奇怪字符的情况。
占用大小
Musha 的这个文件系统很奇怪,首先,文件夹本身不占用空间,可以理解为大小为 0,但因为文件夹里面有内容,所以文件夹占用的空间为其子节点占用空间之总和;常规文件占用的大小以字节为单位;硬链接占用的大小时刻与它指向的内容保持一致,本身也不占用大小。
Musha 可以给文件夹设置最大占用空间,若某个操作使得任何一个文件夹超出了占用空间限制,则操作失败,不产生任何影响。
文件夹默认的空间限制为正无穷,你可以使用 2147483647
来代替。
初始状态与指令
初始,系统中只有一个根目录,用 root
表示,全部的操作均从根目录开始。
路径使用 /
隔开,且开头、末尾均没有 /
,比如 root/include/cstdio
表示根目录下 include
文件夹中的 cstdio
文件。
整个文件系统的文件名、文件夹名、硬链接名只由小写字母组成,同一个文件夹下的文件名、文件夹名、硬链接名不会重复。
有下列五种指令:
指令 |
介绍 |
示例 |
mkdir path |
创建文件夹 |
mkdir root/include |
limit path size |
设置文件夹空间限制 |
limit root/include 1024 |
touch file |
创建文件 |
touch root/include/cstdio |
edit file size |
设置文件的大小 |
edit root/include/cstdio 42 |
mklnk dst src |
创建硬链接 |
mklnk root/usr/inc/cstdio root/include/cstdio |
- 创建文件夹:允许逐层创建,保证从
root
开始,且完全合法,保证至少可以创建一个文件夹。
- 文件夹空间限制:允许多次设置,若
size
小于当前实际占用,则设置失败。数据保证 path
存在且为文件夹或指向文件夹的硬链接。
- 创建文件:要求父文件夹必须存在,否则创建失败。也不可以与同文件夹内的文件夹、硬链接名重合,否则也算创建失败。文件初始大小为 0.
- 设置文件的大小:允许多次设置,数据保证
file
存在且不是文件夹或指向文件夹的硬链接。
- 创建硬链接:创建硬链接
dst
指向 src
,数据保证 src
存在,保证 dst
的父文件夹存在,且硬链接没有与父文件夹中的其他内容重名。请留意,src
当然也可以是一个硬链接,在这种情况下,你应该使 dst
指向 src
所指向的内容。