一、問題的提出
Windows中文件夾的拷貝實現了單個文件到多級目錄的拷貝,一般在處理大量數據拷貝之類耗時的操作,都會另外創建新的線程來處理。現在要編寫一個多線程拷貝多級目錄的程序,要求用多線程實現,在拷貝過程中程序界面響應其它消息,並且要求有拷貝的進度顯示和狀態顯示。
二、拷貝多級目錄的一些基本知識
MFC或WIN32 SDK沒有提供拷貝目錄的相關函數,或者不能顯示拷貝的狀態,如自定義的進度顯示,所以只能通過自己遍歷一個目錄及子目錄來獲得,這就需要用到查找文件。MFC提供了CFindFile來實現這個功能。
對於拷貝函數,有CopyFile和CopyFileEx,CopyFileEx提供了進度顯示等功能,但需要回調函數,比較麻煩且不符合程序的要求,所以用拷貝時的文件尺寸比來設置進度顯示。
因為要在拷貝過程中響應用戶,所以需要用到多線程,多線程實現並行處理,避免了某項任務長時間占用CPU時間,也不讓用戶感覺程序有“死掉”的感覺。
三、編程思路
創建一個基於對話框的程序,命名為CopyFolder
1、對於多線程處理
在程序的構造函數裡,創建一個自動事件對象和一個線程,在線程回調函數裡用循環等待事件信號,受信才會執行具體的拷貝工作。設置受信在開始拷貝函數中調用。另外程序提供了線程的掛起和恢復功能,線程的停止設置了標志位,以便使在循環拷貝中跳出循環,停止文件的拷貝。
2、得到目錄
用SHGetPathFromIDList和BROWSEINFO處理來返回源文件夾和目標文件夾的路徑
3、顯示進度
進度的顯示比是按源文件夾的總尺寸除當前正在拷貝的文件尺寸得到,但Windows沒有提供相應得到文件夾尺寸的函數,根據使用Windows的經驗,Windows也是通過遞歸循環得到尺寸,所以通過遍歷每個文件得到尺寸並累加來得到所選文件夾的總尺寸。
4、同步界面
按是否正在拷貝來同步界面上所有的相關控件
5、拷貝文件夾
主要實現函數。
1)如何得到源文件相應的目標路徑
遞歸查找得到源文件的路徑,問題是目標路徑的獲得和設置。如源文件夾為G:\Documents\Article,目標路徑選擇為H:\,那麼目標拷貝路徑應該為H:\Article,對於拷貝源文件G:\Documents\Article\One\Sample.txt來說,目標路徑應該為H:\Article\One\Sample.txt。如何從源文件路徑中取得正確路徑拷貝到目標路徑,思路為得到當前源文件路徑的長度(G:\Documents\Article\One\Sample.txt),減去一開始選擇的路徑(G:\Documents\Article),這樣得到的是\One\Sample.txt,在加在拷貝路徑的後面,形成H:\Article\One\Sample.txt。
2)如何創建目錄
得到了源文件和目標文件的路徑,但這樣調用CopyFile並不能成功。因為可能Article或One並未創建,所以需要通過目標路徑逐層創建目錄。
具體實現為
int nPos = -1;
while( (nPos = strDest.Find( _T("\\"), nPos+1) ) != -1 )
{
CString str = strDest.Left(nPos);
CreateDirectory(strDest.Left(nPos),歡迎光臨
學網,
收藏本篇文章 [1] [2]
$False$
NULL);
}