1. 程式人生 > >【磁碟處理相關方法】4,格式化磁碟 (Windows標準格式化介面和靜默無介面格式化方法)

【磁碟處理相關方法】4,格式化磁碟 (Windows標準格式化介面和靜默無介面格式化方法)

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環境。測試,格式化有效,而且無任何介面出現。