【问题标题】:Prepend to file without temp file by manipulating inode?通过操作 inode 在没有临时文件的情况下添加文件?
【发布时间】:2013-07-05 03:22:34
【问题描述】:

预置大文件很困难,因为它需要全部推送 其他字符向前。但是,是否可以通过操纵来完成 inode如下?:

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

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

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

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

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

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

【问题讨论】:

    标签: file prepend inode


    【解决方案1】:

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

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

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

    【讨论】:

    • 我同意应该隐藏 inode。我们正在为操作系统寻找一种方法来为我们做 inode 摆弄。由于文件是一棵树,因此在开头或其他任何地方插入应该与通过附加到文件仅在末尾插入一样快。
    • 如果 inode 的范围簿记结构是树状的(这取决于 FS),那么“稀疏文件”前置移动应该——理论上;)——可以解决问题。你试过了吗?
    • IIUC,您建议在文件开头保留 50mb 的稀疏未使用空间,在某处记录读取时要忽略的文件的多少,当您有新的 MB 要添加时,减少它到 49 并写在稀疏部分的末尾。这应该可以,但是如果能够在文件中的任何位置插入就更好了。
    【解决方案2】:

    这可以工作!是的,用户态程序不应该与 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2013-03-04
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多