我在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;
提前感谢您的想法和答案。
答案 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)块所属的文件来防止已经碎片整理的文件系统被重新排序至。此外,如果您正在交换的文件为空,则可以通过不实际复制内容来简化交换,如果blocknum
和i
相同,则完全跳过交换操作。
伪代码如何转换为C代码完全取决于您的实现。