以下文章來源於CSDN:
在Windows中實現檔案的操作主要有兩種方法。一種是直接利用CFile 類的操作成員函數來實現,它要用到對於檔案操作的底層操作方式,如READ、WRITE、GETLENTH等,並且要直接操作檔案的屬性,如建立、讀、寫等;而且,其緩衝區的設定對於檔案的大小和不同的電腦是不同的,特別是對於長度很大的資料庫進行備份,很難達到最佳效果。
---- 另一種有效方式是利用Win32外殼來實現這些對於檔案的操作。它可以實現包括檔案的拷貝、更名、移動及刪除等,並且可以支援萬用字元(如*和?),也可以直接對一個目錄或分類樹進行操作。
---- 本文分析了Win32外殼API對於檔案操作的原理,並利用Visual C++6.0實現檔案的拷貝操作。
---- 一、 原理與結構
---- Windows95/NT中提供了一個API函數SHFileOperation(),它只有一個指向SHFILEOPSTRUCT結構的參數。SHFileOperation()函數的原形如下:
---- WIN SHELL API int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp);
---- LPSHFILEOPSTRUCT結構包含有進行檔案操作的各種資訊,其具體的結構如下:
Typedef struct _ShFILEOPSTRUCT {
HWND hWnd; //訊息視窗
UINT wFunc; //操作類型
LPCSTR pFrom; //源檔案及路徑
LPCSTR pTo; //目標檔案及路徑
FILEOP_FLAGS fFlags; //操作與確認標誌
BOOL fAnyOperationsAborted; //操作選擇位
LPVOID hNameMappings; //檔案對應
LPCSTR lpszProgressTitle; //進度視窗標題
} SHFILEOPSTRUCT, FAR* LPSHFILEOPSTRUCT;
---- 在這個結構中,有幾個成員很重要。hWnd是指向發送訊息的視窗,pFrom與pTo是進行檔案操作的源檔案名稱和目標檔案名,它包含檔案的路徑,對於多個檔案名稱之間用NULL作為間隔,並且可以支援萬用字元*和?。如源檔案或目錄有兩個,則應是:
char pFrom[]="c://windows//command/0c://dos//himem.sys/0"
---- 它表示對c:/windows/command目錄下的所有檔案和c:/dos/himem.sys檔案進行操作。'//'是C語言中的'/'的轉義符, '/0'則是NULL。wFunc 是結構中的重要成員,它指出將要進行的操作類型,是下面的操作類型之一:
---- FO_COPY: 拷貝檔案pFrom到pTo 的指定位置。
---- FO_RENAME: 將pFrom的檔案名稱更名為pTo的檔案名稱。
---- FO_MOVE: 將pFrom的檔案移動到pTo的地方。
---- FO_DELETE: 刪除pFrom指定的檔案。
---- 在進行檔案拷貝、移動或刪除時,如果需要的時間很長,則會在進行的過程中出現一個無模式的對話方塊,可以顯示執行的進度和執行的時間,以及正拷貝移動或刪除的檔案名稱,成員lpszProgressTitle顯示此對話方塊的標題。fFlags是在進行檔案操作時的過程和狀態控制標識。它主要有如下一些標識,也可以是其組合。
---- FOF_FILESONLY:不執行萬用字元,只執行檔案.
---- FOF_ALLOWUNDO:儲存 UNDO資訊,以便恢複.
---- FOF_NOCONFIRMATION: 在出現目標檔案已存在的時候,如果不設定此項,則它會出現確認是否覆蓋的對話方塊,設定此項則自動確認,進行覆蓋,不出現對話方塊。
---- FOF_NOERRORUI: 設定此項後,當檔案處理過程中出現錯誤時,不出現錯誤提示,否則會進行錯誤提示。
---- FOF_RENAMEONCOLLISION: 當已存在檔案名稱時,對其進行更換檔案名稱提示。
---- FOF_SILENT: 不顯示進度對話方塊。
---- FOF_WANTMAPPINGHANDLE: 要求SHFileOperation()函數返回正處於操作狀態的實際檔案清單,檔案清單名柄儲存在hNameMappings成員中。 SHFILEOPSTRUCT將包含一個SHNAMEMAPPING結構的數組,此數組儲存由SHELL計算的每個處於操作狀態的檔案的新舊路徑。
---- 二、 執行個體操作
---- 本文就一個Visual C++程式來實現檔案複製的執行個體。首先建立一個單一文件介面filecopy,然後在主架構中新增一個工具條變數m_wndMyToolBar,建立一個工具條IDR_MYTOOLBAR,設定一個工具訊息ID_FILECOPY,並在主架構MainFrm.cpp的OnCreate()成員函數中加入工具列。
if(!m_wndMyToolBar.Create(this)||
!m_wndMyToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE("can not create the FileToolBar!/n");
return -1;
}
---- 通過中視類操作工具條IDR_MYTOOL,利用ClassWizard為其訊息ID_FILECOPY新增訊息處理函數OnFilecopy。然後在處理函數中加入下面程式。
void OnFilecopy()
{
int nOk;
char strSrc[]="c://dos/0c://pwin98//command/0";
//可以改變源路徑
char strDst[]="c://temp/0";
//設定目的路徑
char strTitle[]="File copying";
//進度題頭
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_COPY;
//執行檔案拷貝
FileOp.pFrom=strSrc;
FileOp.pTo=strDst;
FileOp.fFlags=FOF_ALLOWUNDO;
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle;
nOk=SHFileOperation(&FileOp);
if(nOk)
TRACE("There is an error: %d/n",nOk);
else
TRACE("SHFileOperation finished successfully/n");
if(FileOp.fAnyOperationsAborted)
TRACE("Operation was aborted!/n");
}
---- 三、 結束語
---- 利用Windows API進行程式檔案操作設計,它直接調用Windows作業系統中的外殼,它的處理過程與Windows95/98/NT中的處理過程是一致的有利於我們在系統程式設計中保持與作業系統的一致性;同時,由於在檔案處理中它是直接調用Windows API函數,因此不需要其它應用程式動態連結程式庫DLL的支援。
---- 在各種開發軟體中,都提供了對於檔案的各種操作方式,但是它必須利用到檔案系統較為深入的知識,而且對於其操作的直觀性方面也需要開發人員進一步地設計,因此利用作業系統SHELL進行程式設計,不失是一種好的設計方法。