当文件被写到硬盘时,可能被写入不连续的族中。不连续的族会降低文件读写操作的效率。不连续存放的文件被称为碎片文件。为了优化碎片文件的访问速度,卷必须进行碎片整理。
碎片整理是为了整理文件碎片而在disk上移动文件内容的处理过程。即:在disk上移动存放文件数据的族来使文件族连续的处理过程。
在简单的单任务OS中,碎片整理软件是唯一的执行任务,不存在别的进程对磁盘进行读写操作。然而,在多任务OS中,当有某个进程试图对硬盘进行碎片整理的同时,可能会存在别的进程在对硬盘驱动器进行读写。
应用三个控制代码可以解决不用详细了解文件系统的disk结构就可以进行碎片整理操作。这允许应用程序定位空族、确定文件族的磁盘位置、和在磁盘上移动文件。运用它们可以解决在文件移动时阻止和允许对文件读写的问题。
这些操作能够在不打捞其它进程运行的同时进行相应的整理操作。然而,其它进程的响应时间将会变慢。
使用如下步骤来整理文件碎片:
1、通过使用FSCTL_GET_VOLUME_BITMAP控制代码在卷上寻找一个足以存放整个文件的空间。如果有必要,可以通过移动别的文件来产生存放整个碎片文件所需的空间。
2、通过使用FSCTL_GET_RETRIEVAL_POINTERS控制代码在disk上获取文件的分布映射(map)。
3、遍历上部返回的RETRIEVAL_POINTERS_BUFFER结构。在遍历时,通过使用FSCTL_MOVE_FILE控制代码来移动每个族。当其它进程对磁盘进行读写时,你可能要不断地更新前两步反会的结构。
有两个操作在碎片整理时需要卷的句柄。只有系统管理员可以获取卷句柄,所以只有具有管理员身份的进程才可实施卷整理。你的程序应该检查试图进行碎片整理的软件的权限。如果用户不具有相应的权限是不允许进行碎片整理的。
当在对FAT或FAT32卷进行整理的同时,又使用CreateFile()函数打开目录,不要指定MAXIMUM_ALLOWED访问值。如果这样做了,试图访问目录将会被拒绝。应该指定GENERIC_READ 访问值。
本文地址:http://com.8s8s.com/it/it23736.htm