磁碟格式化的程式設計實現

2021-03-31 08:56:30 字數 2326 閱讀 7084

北京機械工業學院 冉林倉

磁碟格式化是計算機使用者經常使用的操作之一,但由於作業系統的控制台和外殼(shell)提供了對格式化的完美支援,使程式設計人員很容易忽視使用者對格式化的基本需求。在他們看來,磁碟格式化對使用者來說並不是乙個太大的問題,應用程式不必要對它提供支援。其實,這是乙個錯覺,當使用者在執行應用程式遇到需要格式化磁碟時,再切換到控制台或者資源管理器去格式化磁碟是非常不便和煩瑣的。

還有一部分程式設計人員認為磁碟格式化很容易實現,沒有技術障礙,因此沒有賦予足夠重視。其實,在實際程式設計時筆者發現磁碟格式化是乙個不大不小的問題。一方面,它要求程式設計盡量簡單,不要涉及中斷、埠讀寫、物理扇區訪問、vxd、wdm驅動程式等複雜細節,只要能實現格式化即可,**越簡單越好,最好是只呼叫乙個函式即可實現。另一方面,筆者卻發現,基本上所有的程式設計參考書籍都對這個問題隻字不提,在msdn中也很難找到乙個具有這樣功能的formatdisk函式。當然,我們可以利用winexec、createprocess和shellexecute等函式去執行format命令,並且這方案完全可行,不過隨之產生的控制台視窗會使我們的視窗程式顯得不倫不類,破壞原有的程式介面。雖然我們還可以通過設定createprocess函式的引數實現對控制台視窗的隱藏,使format.exe隱蔽地在後台執行,但這又需要我們維護它的完整路徑,這也存在一定困難。

主要函式

從實際應用的角度看,從windows 9x到windows nt都應該提供這個formatdisk函式,否則怎麼實現資源管理器視窗的磁碟格式化呢?筆者通過仔細查詢發現,windows 確實提供了這樣乙個函式,儘管文件資料沒有註明,但是如果我們使用view dependencies開啟shell2.dll,就會發現這個函式。它就是shformatdrive,編譯連線到shell32.lib。儘管通過平台的sdk文件和shellapi.h檔案並不能發現這個函式,但是win32各個作業系統都能找到它的蹤影。應用程式可以通過呼叫這個函式實現借用外殼的磁碟格式化對話方塊格式化磁碟。呼叫約定如下:

dword winapi shformatdrive(hwnd hwnd,uint drive,uint fmtid,uint options);

引數含義如下:

hwnd:擁有對話方塊的視窗控制代碼,注意hwnd為null時,並不會導致這個對話方塊生成乙個上層的應用程式,也就是說,這個引數總是非null,這個對話方塊只能作為乙個視窗的子視窗,而不能作為乙個單獨的應用程式;

drive:要格式化的驅動器號,以a: == 0為基準,依此類推;

fmtid:必須設定為 shfmt_id_default,即0xffff;

options:可以有兩個選擇項:shfmt_opt_full 0x0001和shfmt_opt_sysonly 0x0002,如果這一項設定為零,系統就要使用快速格式化作為預設設定。

該函式的返回值要麼為乙個下列以shfmt_開頭的值,要麼是乙個成功格式化的磁碟標識。

//上次格式化出錯,磁碟可能被格式化

#define shfmt_error 0xffffffffl

//格式化被取消

#define shfmt_cancel 0xfffffffel

// 不能進行磁碟格式化

#define shfmt_noformat 0xfffffffdl

實現步驟

1.函式介面宣告

typedef dword (winapi *pfnshformatdrive)(hwnd hwnd,uint drive,uint fmtid,uint options);

2.載入shell32.dll庫

hinstance hinstance=loadlibrary(_t

(「shell32.dll」));

if(hinstance==null) return;

3.獲得函式指標

pfnshformatdrive pfnshformatdrive=(

pfnshformatdrive)getprocessaddress(_t

(「shformatdrive」));

if(pfnshformatdrive==null)

4.呼叫函式

(pfnshformatdrive)(hwnd,drive/*a:==0*/,fmtid/* shfmt_id_default */,options);

5.釋放控制代碼資源

freelibrary(hinstance);

return;

本程式在windows 2000環境下除錯通過,使用delphi、visual basic的使用者通過呼叫上述windows sdk 函式也可以實現磁碟格式化。

磁碟格式化

檢視系統支援的檔案系統格式 cat etc filesystems 格式化 mke2fs t ext4 b 2048 dev sdb1 不支援格式化xfs檔案系統格式 t後面加的是檔案系統格式 如果不指定,預設為ext2 b後面加的是指定塊兒大小 b可省略 m指定分割槽預留的大小 mke2fs t ...

47 磁碟格式化

注 在磁碟劃分好之後 是不能使用的 還嫌格式化,因為liunx和win不一樣 最好還需要繼續掛載目錄 在centos6的版本 同版本 之前 都是用ext的格式 但是在centos的之後就換了一種格式xfs 檢視系統所支援的分割槽格式 root localhost cat etc filesystem...

LFS磁碟格式化相關

mke2fs 1.42.9 4 feb 2014 fs types for mke2fs.conf resolution ext3 filesystem label os type linux block size 4096 log 2 fragment size 4096 log 2 stride...