前置大文件很困难,因为它需要全部推送 其他角色前进。但是,可以通过操纵来完成 inode如下?:
在磁盘上分配新块并填充前置数据。
调整inode告诉它你的新块现在是第一个 阻止,并将前一个块碰撞到第二个块 位置,前第二个块到第三个位置,依此类推。
我意识到这仍然需要向前冲击块,但它应该是 比使用临时文件更有效。
我还意识到新的第一个块将是一个“短”块(并非块中的所有数据都是文件的一部分),因为前置数据不可能与块完全相同。
或者,如果简单地链接inode块,则需要的很少 努力做到这一点。
注意:我上次直接操作磁盘数据的经验是用 Commodore 1541,所以我的知识可能有点过时......
答案 0 :(得分:1)
现代操作系统不应该允许用户这样做,因为inode数据结构特定于底层文件系统。
如果您的文件系统/操作系统支持它,您可以通过在开头添加空数据,然后写入稀疏块来使您的文件成为稀疏文件。理论上,这应该给你你想要的东西。
YMMV,我只是在四处寻找想法。 ;)
答案 1 :(得分: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