windows的磁盤操作之八——格式化分區的思考

格式化分區平常在我們看來是再普通不過的操作了,點兩下鼠標就可以搞定的事情,但是在程序中實現的的確確不太容易。可能有人說直接調個format命令不就好了,沒錯,但系統命令存在我們第一節http://cutebunny.blog.51cto.com/301216/624027中闡述的種種問題。

算上format命令,目前我發現有三種方法,
1Windows API SHFormatDrive。函數原型如下
DWORD SHFormatDrive(
HWND hwnd,
UINT drive,
UINT fmtID,
UINT options
);
參數drive就是需要格式化的分區,從0開始計數。0代表A: 2代表C: 等等。其餘參數詳見MSDN。調用這個函數回彈出我們非常熟悉的對話框,相信我們右鍵格式化調用的就是它。

調用方法很簡單:

SHFormatDrive(0, 8, SHFMT_ID_DEFAULT, SHFMT_OPT_FULL);

不幸的是,這個API無法讓格式化自動開始,無論如何都不可以,必須手動去點一下“開始”。鬱悶了吧,有人建議可以搞個定時器,再去模擬一下Enter,等格式化完了再Enter一次。原理上可行,但總覺着有些不倫不類。
 
2.利用FMIFS.dll中的未公開函數FormatEx
有位叫Mark Russinovich的大牛寫出了具體代碼,我暫時還沒花時間去調,僅供大家參考。代碼詳見附件。
 
3Format命令
這是沒辦法中的辦法了,代碼如下,很簡單,不多解釋。
/******************************************************************************
* Function:
* input: disk, disk name
* output: N/A
* return: Succeed, 0
*         Fail, 1
******************************************************************************/
DWORD FormatVolume(CHAR letter)
{
    DWORD ret;
    CHAR cmd[64];
    sprintf(cmd, "format %c: /FS:NTFS /Q /Y", letter);
    ret = (DWORD)system(cmd);
    return ret;
}
 
 
總結
關於windows下磁盤操作編程的討論到這裏就告一段落了,最後再總結一下我們前面列舉的所有例子。
DWORD GetAllPresentDisks(DWORD **disks);        //查詢系統下的所有物理磁盤號
DWORD GetSystemDiskPhysicalNumber(void);        //獲取操作系統所在的物理磁盤號
DWORD GetPhysicalDriveFromPartitionLetter(CHAR letter);    //根據邏輯分區號查詢物理磁盤號
DWORD GetDriveGeometry(const CHAR *disk, DISK_GEOMETRY *pdg);    //查詢磁盤物理信息
DWORD GetDiskDriveLayout(const CHAR *disk, DRIVE_LAYOUT_INFORMATION_EX *driveLayout);          //查詢磁盤分區信息
DWORD DestroyDisk(DWORD disk);        //刪除磁盤分區表
DWORD CreateDisk(DWORD disk, WORD partNum);     //初始化磁盤並創建分區
DWORD GetPartitionLetterFromPhysicalDrive(DWORD pDriveNumber, CHAR **letters);     //查詢某塊物理磁盤上的所有分區
DWORD FormatVolume(CHAR letter); //格式化分區
 
上述函數有些相當危險,可能瞬間就破壞掉磁盤分區表,大家調試的時候請多加小心。當然,也不要用它來做壞事哦。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章