4

前置大文件很困难,因为它需要将所有其他字符向前推。但是,可以通过如下操作 inode 来完成吗?:

  • 在磁盘上分配一个新块并填充您的前置数据。

  • 调整 inode 告诉它你的新块现在是第一个块,并将之前的第一个块碰撞到第二个块的位置,之前的第二个块到第三个位置,依此类推。

我意识到这仍然需要向前碰撞块,但它应该比必须使用临时文件更有效。

我还意识到新的第一个块将是一个“短”块(并非块中的所有数据都是文件的一部分),因为您的前置数据不太可能与块的大小完全相同。

或者,如果 inode 块是简单链接的,那么执行上述操作只需要很少的工作。

注意:我上次直接操作磁盘数据的经验是使用 Commodore 1541,所以我的知识可能有点过时了......

4

2 回答 2

1

现代操作系统不应允许用户这样做,因为 inode 数据结构特定于底层文件系统。

如果您的文件系统/操作系统支持它,您可以通过在开头添加空数据,然后写入稀疏块来使您的文件成为稀疏文件。从理论上讲,这应该给你你想要的。

YMMV,我只是在胡思乱想。;)

于 2013-07-16T14:48:06.537 回答
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
于 2013-07-17T14:49:37.360 回答