一、前言
本人在開發惠普色譜工作站增強軟件的過程中,實現了把指定目錄下的色譜數據文件全部轉換成純文本文件的功能。下面,通過用一個具體的例子來說明此功能的實現方法。
全部代碼用Visual C++6.0在Windows95/98/2000下編譯通過。
二、實例
首先用MFC AppWizard生成一個SDI風格的應用程序test,生成過程中全部使用缺省設置。
其次,利用資源編輯器,在主菜單“文件”下增加一個菜單項“轉換”,屬性為:
ID:ID_CONVERT
Caption: 轉換
Prompt: 在不同格式文件之間進行轉換轉換文件
然後用“CTRL-W”熱鍵激活MFC ClassWizard,為CmainFrame類增加響應ID_CONVERT消息的命令函數OnConvert()。加入轉換功能的代碼如下所示:
void CMainFrame::OnConvert()
{
LPMALLOC pMalloc;//利用shell擴展功能
BROWSEINFO bi;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))//為生成目錄選擇對話框分配自由內存
{
ZeroMemory(&bi,sizeof(bi));//清零分配的空間
char pszDirName[MAX_PATH];//存放選擇的目錄名
LPITEMIDLIST pidl;
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = pszDirName;
bi.lpszTitle = _T("選擇要批量轉換文件所在的目錄");
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)//調用選擇目錄對話框
{
if (::SHGetPathFromIDList(pidl, pszDirName))//獲得所選擇的目錄
{
file://設置選擇的目錄為當前目錄,以便查找
SetCurrentDirectory(pszDirName);
file://定義一個查找
CFileFind findch1;
CString strconv;
CString strsour;
if(findch1.FindFile("*.CH1"))//在當前目錄進行查找
{
CFile SourceFile;
CStdioFile TargetFile;
BOOL bfindresult;
do
{
file://查找下一個符合條件的文件
bfindresult= findch1.FindNextFile();
file://獲得查找到的文件名
strsour=findch1.GetFilePath();
strconv=strsour;
file://把文件名轉換為小寫
strconv.MakeLower();
file://把*.ch1類型的文件轉換為*.txt
strconv.Replace(".ch1",".txt");
file://打開*.ch1類型的文件作為源文件
SourceFile.Open(strsour,CFile::modeRead);
file://打開*.txt類型的文件作為目標文件
TargetFile.Open(strconv,CFile::modeCreate|CFile::modeWrite);
file://此處調用*.ch1類型的文件的解碼函數
file://此處調用轉換成文本文件的函數
file://文件使用完畢,要關閉
SourceFile.Close();
TargetFile.Close();
}while(bfindresult);
MessageBox("轉換完畢!","轉換完畢!",MB_OK);
}
else
{
MessageBox("沒找到CH1文件","沒找到",MB_OK);
}
findch1.Close();//關閉這個搜索
}
pMalloc->Free(pidl);//釋放使用完的資源
}
pMalloc->Release();//釋放使用完的資源
}
}
編譯並運行程序,選擇“文件”菜單下的“轉換”命令, 選擇一個目錄就完成了對此目錄下所有具有.ch1擴展名的文件的轉換工作。
三、結論
本程序利用了Windows95/98/2000下的shell擴展功能,實現了對一個用戶指定目錄的拾取,再利用MFC的CfileFind類,來檢索出所有想要轉換的源文件,最後通過編碼轉換把源文件內容輸出到指定類型的目標文件。這個方法也適合於要大量在不同格式的文件之間進行轉換的工作,如圖形文件、聲音文件等的轉換。希望有興趣的朋友和我交流討論。