一、問題的提出
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 )
四、詳見**
ListView實現多級目錄
利用listview實現二級目錄,自己寫著玩玩,包含分割節點,如下 實體類itementity public class itementity介面卡multibaseadapter public class multibaseadapter extends baseadapter public vo...
多執行緒拷貝檔案
多執行緒拷貝檔案的步驟 宣告乙個帶有 原始檔,目標檔案,當前執行緒拷貝開始位置,當前執行緒拷貝結束位置 這4個引數的構造器 拷貝執行緒中需要實現 1.統計當前執行緒的拷貝進度 2.使用randomaccessfile獲取輸出流,然後使用seek 方法跳過需要讀寫位元組數 3.while迴圈的條件要加...
python多執行緒實現資料夾拷貝
import threading import os import shutil 建立拷貝任務 def copy work source dir,dest dir,file name 拼接檔名路徑 source file path source dir file name dest file pat...