利用API函數SHFileOperation複製或刪除整個目錄

API描述是這樣的:
Performs a copy, move, rename, or delete operation on a file system object.

WINSHELLAPI int WINAPI SHFileOperation(
   LPSHFILEOPSTRUCT lpFileOp 
); 

Parameters
lpFileOp
Pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out the operation. 

Return Values
Returns zero if successful or nonzero if an error occurs. 

函數只有一個參數lpFileOp,類型是LPSHFILEOPSTRUCT,這是一個結構,裏面定義了從哪複製到哪,或者是刪除哪個目錄或文件。

結構定義:
typedef struct _SHFILEOPSTRUCT { //shfos 
    HWND         hwnd;
    UINT         wFunc;
    LPCSTR       pFrom;
    LPCSTR       pTo;
    FILEOP_FLAGS fFlags;
    BOOL         fAnyOperationsAborted;
    LPVOID       hNameMappings;
    LPCSTR       lpszProgressTitle;
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

主要成員說明:
hwnd    主窗口句柄,可爲空
wFunc   指定操作類型(FO_COPY,FO_DELETE,FO_MOVE,FO_RENAME分別對應 複製,刪除,移動,重命名)
pFrom   源目錄或文件
pTo     目標目錄或文件(如果是刪除操作FO_DELETE,此參數將忽略)
fFlags  包含如下取值

   FOF_ALLOWUNDO           允許撤銷,如FO_DELETE操作則會刪除到回收站中
   FOF_CONFIRMMOUSE        Not implemented(應該是未實現)
   FOF_FILESONLY           只對文件操作,前提是使用通配符*.*
   FOF_MULTIDESTFILES      //
   FOF_NOCONFIRMATION      不顯示覆蓋文件對話框
   FOF_NOCONFIRMMKDIR      不提示創建文件
   FOF_RENAMEONCOLLISION   如果有相同文件則改名
   FOF_SILENT              安靜模式
   FOF_SIMPLEPROGRESS      //
   FOF_WANTMAPPINGHANDLE   //

...

說明:
    可以把它理解成類似於在資源管理器或用COPY命令的操作。
    如果使用了FOF_SILENT和使用通配符*.*的複製操作,那麼目標目錄必須存在,否則複製會失敗,如果沒有使用通配符*.*的複製,會建立目標目錄,而如果已經存在目標目錄,則會在此目錄下建立子目錄。
    還有如果是BCB的使用者,一定不能簡單的將pFrom和pTo賦值爲類似 Edit1->Text.c_str(),pFrom或pTo很容易被後面賦值的語句篡改,這應該是c_str()本身的問題,可以先定義AnsiString Str,然後再pFrom = Str.c_str()。

另外從其他文章看到的:

1.解決不能下載含中文地址的文件方法:
pchar(URLEncode(UTF8Encode("下載文件")))

2.解決總是從緩存中提取文件造成文件版本不是最新的方法是給鏈接隨便加一個假參數來強制下載:
http://www.xxx.com/xxxx.exe?Param=xxx
或者使用 DeleteUrlCacheEntry 先清空緩存,但這樣可能較慢,因爲緩存中可能還包含其他大量的網頁內容。

我自己倒是沒碰到第二種情況,雖然第二次下載速度很快,明顯是從緩衝中取出的,但如果更新了文件就會重新下載,也許是XP中改進了這個API吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章