我正在开发一个类似于Unix 文件系统的程序。我在 C 中工作。我遇到了以下问题:
- 有问题的函数是从目录中删除特定文件条目的函数。
- 该目录有一个 iNode 和一个数据块。这个数据块是一个固定大小的数组,我想在其中删除一个条目。
- 我正在处理的数组是一个固定长度的 14 个结构条目的数组
- 结构看起来像这样
typedef struct {
int16_t iNodeNumber;
char Filename[14];
} Entry;
请注意,数组的内存在堆栈上,而不是堆上。
我想要什么: 从数组中删除特定条目,同时保持数组的长度
我所做的: 我用下一个索引的内容替换当前位置(我必须删除信息的位置),直到我到达数组的末尾。因此,我可以确保在删除时,在下一个数组位置有一个空块的每个条目实际上是最后一个。(无碎片)
但是,如果我想删除数组的最后一个条目(位置 13),这不起作用。我还考虑将文件名设置为空字符串,但 iNodeNumber 呢?它是一个范围从 2 到 23 的数字;0 和 1 是为其他用途保留的特定 iNode 编号。
谢谢!
编辑:这里有更多的问题解释:假设我们有一个目录,让我们拿这个目录。
/例子
在 UFS 中,由于每个文件都由 Inode 而不是名称表示,因此该目录将由以下结构表示:
typedef struct {
stat iNodestat;
int16_t dataBlock[14]
} iNodeEntry
stat 结构体可以省略,它只是一个结构体,其中包含有关 inode 的信息,如编号、模式、文件大小等。
该数据块是一个整数数组。这些整数只是引用一个内存块。一个常规文件 iNodeEntry 可能有 14 个数据块。在目录的情况下,它只有一个数据块。这个唯一的块编号引用了一个内存块,其中包含作为本文主题的数组。
该数组由上面显示的Entry结构组成。它正好包含 14 个这样的结构。
总而言之,这是一个具体的例子。考虑 :
- /example 目录没有文件
- 它的 iNode 编号是 2
然后它将有两个条目填充数组中可用的 14 个信息中的信息:
- 文件名 : '。' , iNode 数量 : 2
- 文件名:'..',iNode 编号:无论父目录 iNode 编号是什么