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吧。