Shell操作SHFileOperation

來源:互聯網
上載者:User

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     //將檔案清除,否則直接刪除,一般這個最好做預設

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.