none
关于磁盘文件访问与修改 RRS feed

  • 问题

  • 问一下大家有没有API函数获取磁盘的信息及文件在磁盘中的物理位置,并修改文件的物理位置(磁盘碎片整理程序)
    2010年5月15日 3:09

答案

  • Defragmenting Files

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 0度转身 2010年5月17日 11:19
    2010年5月15日 15:10
    版主
  • 在Windows下也可以通过CreateFile,ReadFile,WriteFile和一个特殊的API DeviceIoControl进行,只不过输入的文件名不再是磁盘的文件名了,而是你的硬盘设备的IO映射位置,类似于\\.\PHYSICALDRIVE0这样的路径,你首先需要熟悉底层的Windows是如何控制IO的,需要参考MSDN,CreateFile的标准设备IO部分和DeviceIoControl部分.磁盘碎片整理就是用的这4个API.


    0xBAADF00D
    • 已标记为答案 0度转身 2010年5月17日 11:20
    2010年5月15日 16:34
    版主

全部回复

  • Defragmenting Files

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 0度转身 2010年5月17日 11:19
    2010年5月15日 15:10
    版主
  • 依我对文件系统的了解,如果要获取文件在磁盘中的物理位置的话,就需要了解一些文件系统方面的知识,比如BPB信息,要修改文件的物理位置也是如此。

    文件系统利用簇来管理文件,文件在磁盘中的物理位置是按簇号来确定的,文件所在的目录项里记录着该文件的首簇号。以FAT XX 文件系统为例,FAT表中记录着所有簇号的占用情况,在得到首簇号之后就去FAT表中查找,在与文件首簇号对应的位置记录着下一簇的簇号。如果该文件只占一簇,则该位置被标志为末簇。

    修改文件的物理位置,等于是要修改目录项信息和FAT表中的信息。

    要实现以上的功能,就需要使用与文件、磁盘操作相关的函数。比如CreateFile、ReadFile、WriteFile、SetFilePointer和CloseHandle。这些是WIN32的函数,DOS下得用其他方法。

    另外一点就是,读写磁盘信息的最小单位是扇区,文件分配的最小单位是簇。


    一切都会随着时间的推移而逐渐明朗起来。
    2010年5月15日 15:11
  • 在Windows下也可以通过CreateFile,ReadFile,WriteFile和一个特殊的API DeviceIoControl进行,只不过输入的文件名不再是磁盘的文件名了,而是你的硬盘设备的IO映射位置,类似于\\.\PHYSICALDRIVE0这样的路径,你首先需要熟悉底层的Windows是如何控制IO的,需要参考MSDN,CreateFile的标准设备IO部分和DeviceIoControl部分.磁盘碎片整理就是用的这4个API.


    0xBAADF00D
    • 已标记为答案 0度转身 2010年5月17日 11:20
    2010年5月15日 16:34
    版主