線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3492
推到 Plurk!
推到 Facebook!

關于“函數SHFileOperation()”

尚未結案
WWW999
一般會員


發表:18
回覆:19
積分:7
註冊:2005-09-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-15 10:16:44 IP:222.161.xxx.xxx 未訂閱
在WIN95中實現文件拷貝的編程方法 來源: Bookp.com 作者: oopul 發表: 2005-09-12 字體大小:【大 中 小】 ---- 在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中的處理過程是一致的有利于我們在系統程序設計中保持与操作系統的一致性;同時,由于在文件處理中它是直接調用WindowsAPI函數,因此不需要其它應用程序動態鏈接庫DLL的支持。 ---- 在各种開發軟件中,都提供了對于文件的各种操作方式,但是它必須利用到文件系統較為深入的知識,而且對于其操作的直觀性方面也需要開發者進一步地設計,因此利用操作系統SHELL進行程序設計,不失是一种好的設計方法。 高手,請看這是我在网上找到的一篇關于“函數SHFileOperation()”文章。 我想知道源文件或目錄有兩個時,代碼怎么寫?
系統時間:2024-05-07 7:10:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!