通过操纵inode在不使用临时文件的情况下将内容添加到文件开头?

4
在大文件中添加前缀很困难,因为它需要将所有其他字符向前推。然而,通过以下方式操纵inode,可以完成此操作吗?:
  • 在磁盘上分配一个新块,并填充您的前缀数据。

  • 微调inode以告诉它您的新块现在是第一个块,并将前一个第一块移动到第二个块位置,前一个第二块移动到第三个位置,等等。

我意识到这仍然需要将块向前推,但应该比使用临时文件更有效。
我还意识到新的第一个块将是“短”块(块中并非所有数据都是文件的一部分),因为您的前缀数据不太可能与块的大小完全相同。
或者,如果inode块只是链接的,那么执行上述操作所需的工作将非常少。
注意:我最后一次直接操纵磁盘数据的经验是使用Commodore 1541,所以我的知识可能有点过时...
2个回答

1
现代操作系统不应该允许用户这样做,因为inode数据结构是特定于底层文件系统的。如果您的文件系统/操作系统支持,您可以通过在开头添加空数据,然后写入稀疏块来使您的文件成为稀疏文件。理论上,这应该可以实现您想要的结果。我只是随便提出一些想法,具体情况可能有所不同。;)

我同意应该隐藏inodes。我们正在寻找一种让操作系统为我们处理inode操作的方法。由于文件是一棵树,因此在任何位置插入都应该像仅将内容附加到文件末尾一样快。 - Bruno Martinez
如果inode的范围记帐结构类似于树形结构(这取决于文件系统),那么“稀疏文件”前置移动理论上应该可以解决问题。你试过了吗? - Sven
如果我理解正确的话,您建议在文件开头保留50MB的稀疏未使用空间,在某个地方记录读取时要忽略多少文件,并且当您有一个新的MB要插入时,将其减少到49并写入稀疏部分的末尾。这应该可以工作,但是能够在文件的任何位置插入会更好。 - Bruno Martinez

0

这个方法可行!是的,用户程序不应该乱动inode。是的,它必然依赖于用来跟踪块的方案,以及实现此功能的文件系统。但这些都不是拒绝这个提议的理由。

下面是它的工作原理。

为了举例说明,假设我们有一个inode,通过一个指向数据块的直接指针数组来跟踪块。进一步假设inode带有一个起始偏移量和结束偏移量,分别适用于第一个和最后一个块,这样你可以在文件开头和结尾处有不满块。

现在,假设你想要在数据前面添加内容。操作大致如下。

IF (new data will fit into unused space in first data block)
  write the new data to the beginning of the first data block
  update the starting-offset
  return success indication to caller

try to allocate a new data block
IF (block allocation failed)
  return failure indication to caller

shift all existing data block pointers down by one
write the ID of the newly-allocated data block into the first slot of the array
write as much data as will fit into the second block (the old first block)
write the rest of data into the newly-allocated data block, shifted to the end    
starting-offset := (data block size - length of data in first block) 
return success indication to caller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接