Shell的檔案操作函數
SHFileOperation
功能:
1.複製一個或多個檔案
2.刪除一個或多個
3.重新命名檔案
4.移動一個或多個檔案
有一樣的Win32API功能函數是:
CopyFile(),DeleteFile(),MoveFile()
MoveFile可以對檔案重新命名!
Win32 API 的層次比SHFileOperation低
SHFileOperation
的重要參數
1.wFunc //對pFrom pTo要執行的操作
2.fFlags //影響對wFunx的操作
3.hNameMappings //有系統填充,和你也可以填充
4.lpszProgressTitle
pFrom pTo 在結尾是兩個'/0/0'
通常用一個'/0',這樣會失敗的!!
當FOF_MULTIDESTFILES
szPFrom[lstrlen(szPFrom)+1]=0
szPFrom:必須先確定他所指定的檔案存在!
可以是單個檔案名稱,*.*,或包含統配符的檔案名稱
注意必須是檔案名稱,不是檔案所在的檔案夾名
szSource:可以是一個目錄,如果不是目錄,但又有
多個檔案,那麼必須和szPFrom的每一個檔案對應,還要指定
FOF_MULTIDETFILES標誌
Source and Target
多個檔案---> 一個檔案夾
許多單獨的檔案---->一個檔案夾
單獨檔案--->單獨檔案
許多單獨的檔案---->許多單獨的檔案
單獨檔案:知道名字的檔案
多個檔案:帶有統配符的檔案
注意到source中沒有對檔案夾的操作!!
!!!!
SHFileOperation能操作網路上的檔案
如果你想將本地檔案複製到192.168.1.99
那麼只要在192.168.1.99上共用123目錄
然後將pTo設定為//192.168.1.99/123
就可以了
但不要設定為//192.168.1.99
對hNameMappings操作是Undocumented!!
如果沒有指定hNameMappings
那麼hNameMappings一直是NULL
只有當某種操作(copy,move,rename)引起了檔案名稱衝突了,hNameMappings才不是NULL!!!
當第一次copy某些檔案到空目錄中時hNameMappings一定是NULL
所以hNameMappings只是記憶體中的一塊地區用來讓Explorer.exe儲存被重新命名的檔案,以避免檔案名稱衝突!
上面知道了如何才能使hNameMappings有效
現在如何使用hNameMappings,及其所指的結構大小?並取得這個記憶體塊的內容呢?
hNameMappings 是簡單LPVOID無法使用loop
要使用hNameMappings,必須定義一個結構體
struct HANDLETOMAPPINGS {
UINT uNumberOfMappings; // number of mappings in array
LPSHNAMEMAPPING lpSHNameMapping; // pointer to array of mappings
};
但是可以寫一個Enumerate function to enumerate lpSHNameMapping指向的記憶體塊,並且是讓Window自己調用我的,不是我主動調用,象Loop
相關聯結:
Q154123:File Name Mapping with Windows NT 4.0 Shell
Q133326:SHFILEOPSTRUCT pFrom and pTo Fields Incorrect
Q142066:PRB: SHGetNameMappingPtr() and SHGetNameMappingCount()
Manipulating Files with the SHFileOperation Function in Visual Basic 4.0
FOF_SILENT //不產生正在複製的對話方塊
FOF_NOCONFIRMMKDIR//如果目的目錄不存在,就預設建立
FOF_NOCONFIRMATION //不出現確認檔案替換對話方塊(Confirmation Dialog)(預設替換原來的文i件)
FOF_NOERRORUI//不出現錯誤對話方塊
最好不要同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
因為FOF_NOCONFIRMMKDIR屏蔽了missing directory Error
但FOF_NOERROR又屏蔽了missing directory Error,那麼在同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
時也阻止了新目錄安靜(沒有使用者確認要產生新目錄的對話方塊)的產生!!
那麼如何同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
就必須先確認pTo所指定的目錄存在即可
BOOL MakeSureDiretoryPathExists(LPCSTR DirPath);
使用它要包含imagehlp.h和imagehlp.lib
如何判斷同時存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
FOF_RENAMEONCOLLISION//有重複檔案時自動重新命名
能產生對話方塊的標誌:
FOF_SILENT //progress dialog
FOF_RENAMEONCOLLISION //replace dialog
FOF_NOCONFIRMATION //confirmation dialog
FOF_NOCONFIRMMKDIR //asks for your permission to create a new folder
FOF_NOERRORUI //error message
FOF_ALLOWUNDO //將檔案清除,否則直接刪除,一般這個最好做預設