Visual C++實現檔案間批次轉換功能 (轉)

worldblog發表於2007-12-29
Visual C++實現檔案間批次轉換功能 (轉)[@more@]Visual C++實現間批次轉換功能
唐翊國
  一、前言

  本人在開發惠普色譜工作站增強的過程中,實現了把指定目錄下的色譜資料檔案全部轉換成純文字檔案的功能。下面,透過用一個具體的例子來說明此功能的實現方法。

  全部程式碼用Visual C++6.0在95/98/2000下編譯透過。

  二、例項

  首先用MFC AppWizard生成一個SDI風格的應用test,生成過程中全部使用預設設定。

  其次,利用資源編輯器,在主選單“檔案”下增加一個選單項“轉換”,屬性為:

   ID:ID_CONVERT

   Caption: 轉換

   Prompt: 在不同格式檔案之間進行轉換n轉換檔案

  然後用“CTRL-W”熱鍵啟用MFC ClassWizard,為CmainFrame類增加響應ID_CONVERT訊息的命令OnConvert()。加入轉換功能的程式碼如下所示:

   void CMainFrame::OnConvert()
    {
     LPMALLOC pMalloc;//利用擴充套件功能
     BROWSEINFO bi;
     if (SUCCEEDED(SHGetMalloc(&pMalloc)))//為生成目錄選擇對話方塊分配自由
      {
       ZeroMemory(&bi,sizeof(bi));//清零分配的空間
       char pszDirName[MAX_PATH];//存放選擇的目錄名
       LPITEMIDLIST pidl;
       bi.hwndOwner = GetSafeHwnd();
       bi.pidl = 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 File;
            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類,來檢索出所有想要轉換的原始檔,最後透過編碼轉換把原始檔內容輸出到指定型別的目標檔案。這個方法也適合於要大量在不同格式的檔案之間進行轉換的工作,如圖形檔案、檔案等的轉換。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996148/,如需轉載,請註明出處,否則將追究法律責任。

相關文章