如何在文件系统中实现类似defragmantation的方法

时间:2013-10-12 20:01:53

标签: c file system virtual vfs

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

现在我想实现某种defragmantation方法,它寻找间隙并关闭它们。

因此,如果文件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;

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

1 个答案:

答案 0 :(得分:0)

天真碎片相当简单,假设disk[n]指向 n -th块,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 -th)块所属的文件来防止已经碎片整理的文件系统被重新排序至。此外,如果您正在交换的文件为空,则可以通过不实际复制内容来简化交换,如果blocknumi相同,则完全跳过交换操作。

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

相关问题