0

我用 C 构建自己的虚拟文件系统。

现在我想实现某种碎片整理方法,它会查找间隙并关闭它们。

因此,如果文件 1 的大小为 10 且位于 X 位置,文件 2 的大小为 20 且位于 Z 位置,我希望它移动到 Y 位置。

我现在的想法是取文件 2 的大小,从文件 1 的大小中减去它,然后使用结果将文件 2 向左移动到与结果一样高的位置。

我有一个伪代码,因为我想不出一个可行的解决方案:

for (int i = 0; i < files; i++) 
     //look for inconsistencies/gaps. 

if (found gaps)
    file 2 - file 1 = x;
    shiftfiletotheleft x bytes;

提前感谢您的想法和答案。

4

1 回答 1

0

天真的碎片相当简单,假设disk[n]指的是第n个块并且files是所有文件(或更准确地说,它们占用的块)的集合,包括所有剩余块的伪文件:

i = 0
for file in files:
  for blocknum in file:
    // Swap content
    buf = disk[i]
    disk[i] = disk[blocknum]
    disk[blocknum] = buf

    // Swap metadata
    swap_block(file, blocknum, i)
    file += i
    changed_file = find_file_by_block(blocknum)
    swap_block(changed_file, i, blocknum)

    i += 1

请注意,各种优化是可能的,并且对于良好的用户体验是必要的。例如,由于您无论如何都需要按块编号查找文件,因此您可以通过始终选择当前检查的(第i个)块所属的文件来防止已经碎片整理的文件系统被重新排序。此外,如果您要交换的文件是空的,您当然可以通过不实际复制内容来简化交换,如果blocknumi相同则完全跳过交换操作。

不过,该伪代码如何转换为 C 代码完全取决于您的实现。

于 2013-10-15T16:55:20.873 回答