【磁碟處理相關方法】4,格式化磁碟 (Windows標準格式化介面和靜默無介面格式化方法)
阿新 • • 發佈:2019-01-06
1,目的
介紹一些格式化磁碟的方法,某些程式可能會建立一些自己的碟符,分割槽的建立涉及到驅動開發,這裡不作介紹。
一般會在使用分割槽前進行格式化,這個是可以用API實現的。
下面介紹2種格式化磁碟的方法,一種是彈出平常我們右鍵碟符選擇格式化時的對話方塊,如下:
第二種是一種“偷偷”地格式化,完全沒有任何介面提示,如果你不想讓使用者知道你在格式化的話。
但是,格式化磁碟是需要不少時間的,可能要好幾秒到十幾秒以上。
這個方法花了我不少時間,蒐集多個地方總結出來的。
2,原理及實現
一,Windows標準介面格式化
使用到Shell32.dll 中的一個函式:SHFormatDrive。
首先定義這個函式指標:
typedef DWORD (WINAPI *PFNSHFORMATDRIVE)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
引數說明:
hWnd:當前視窗控制代碼。我們可以就傳NULL。
Drive:要格式的分割槽序號(例:A盤是0,C盤是2)
fmtID:一般設定為SHFMT_ID_DEFAULT
Options:選項,有如下幾個可選值:
SHFMT_OPT_SYSONLY:快速格式化
SHFMT_OPT_FULL :正常(非快速)格式化
封裝好的格式化函式 FormatDisk :(傳入磁碟碟符的字元)
void FormatDisk(WCHAR cDisk) { HINSTANCE hDll=LoadLibraryW(L"Shell32.dll"); if(hDll==NULL) return; PFNSHFORMATDRIVE pFnSHFormatDrive=(PFNSHFORMATDRIVE)GetProcAddress(hDll,"SHFormatDrive"); if(pFnSHFormatDrive==NULL) { FreeLibrary(hDll); return; } pFnSHFormatDrive(NULL,cDisk-L'A',SHFMT_ID_DEFAULT,0); FreeLibrary(hDll); }
二,靜默格式化
可能有人熟悉,用cmd命令 “format” 可以進行格式化。 但是,會有如下這個選擇的介面,需要輸入Y/N:如果我們呼叫cmd.exe並讓其隱藏執行的話,執行到這裡就通不過去了,經測試,結果也並沒有實現格式化。 經過搜尋,和在論壇的詢問,最後加上自己的猜測,我給啟動cmd的引數後加入了"\Y",一試,嘿嘿,果然通過了這個確認選項。 封裝函式如下:
void FormatDisk(WCHAR cDisk) { SHELLEXECUTEINFO sei; SecureZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO); sei.lpVerb = L"open"; CString strCmdPath = L"C:\\Windows\\system32\\cmd.exe"; sei.lpFile = strCmdPath.GetString(); sei.fMask = SEE_MASK_NOCLOSEPROCESS; CString strCmd = CString(L"/c format ")+ CString(cDisk) + CString(L": /fs:ntfs /q /y"); sei.lpParameters = strCmd.GetString(); sei.nShow = SW_HIDE; ShellExecuteEx( &sei ); WaitForSingleObject(sei.hProcess,INFINITE); }
"/c"命令代表cmd執行完成後退出
"/fs:ntfs"指定格式化後的檔案系統型別
"/q"是快速格式化 “/y”是我猜測的確認格式化引數 sei.nShow = SW_HIDE; 代表cmd程序隱藏視窗執行。
WaitForSingleObject(sei.hProcess,INFINITE); 是阻塞直到cmd程序有訊號,這裡是可以等待到其完成。 這裡工程是Unicode環境。測試,格式化有效,而且無任何介面出現。