C语言 在文件中间插入一个字节块而不重写所有内容?



由于文件以块的形式存储在磁盘上,是否可以在块链的中间插入一个块?

这是因为,如果没有这样的API,如果我想在文件中间的某个位置插入一个4kb的块,使用传统的读/写API,我基本上必须重写文件中该位置之后的所有内容,并将它们移动4kb。

我可以接受一个只适用于一些操作系统或一些文件系统的答案。它不必是跨平台的,也不必适用于每个文件系统。

(我也明白不是所有的文件系统或硬件都使用4kb作为块-适用于不同数字的答案也是可以的)。

我不确定文件系统是否允许在中间轻松地扩展文件。然而,许多现代文件系统实际上并没有块链。块链是FAT文件系统家族中的一个东西。相反,现代文件系统中的块通常以树的形式组织。在树中,您可以找到包含O(lgn)个读取的任何字节位置的块,对数具有如此大的基数,可以认为它本质上是常数。

虽然链允许"在中间插入n块"的操作;这棵树相对容易,但不幸的是没有。这并不意味着树是错误的结构——相反,许多数据库系统从它提供的快速随机访问中受益匪浅。

请注意,该树使您能够拥有另一种可能有用的东西,而不是空洞- Unix文件系统具有稀疏文件-文件中已知包含零的任何块实际上根本不需要使用磁盘空间-相反,这些块被标记为未分配并认为在树结构本身中包含零。

最新更新