為什麼沒辦法在 Windows 7 下加快 Windows 7 中檔案複製/傳輸功能呢?可以用 robocopy 實現多線程檔案複製實現。
經常進行檔案管理操作的朋友們,提到複製/粘貼操作,深度系統下載想必很多人還會回想起當初 Vista 奇慢的複製速度,不滿意於 Windows 系統內建的複製功能,因為它太龜速了。於是大家就使用 FastCopy、TeraCopy 之類的軟體來加速複製,Windows 7 隨後則是修複了這一問題,但效果似乎也不理想,但是你是否知道 Windows 7 已經內建快速複製的功能?
解決方案:
建議如果你要拷貝包含多個大容量檔案的目錄,那就需要使用 RoboCopy 命令了,它是一個命令列的目錄複寫命令,自從 Windows NT 4.0 開始就成為 windows 資源工具包的一部分,然後在 Windows Vista、Windows 7 和 Windows Server 2008 採用作為標準的功能內建,這個工具不僅複製速度非常快,而且支援斷點續傳,甚至可以支援在制定的時間定時進行拷貝。Windows 7 中的此項功能也得到升級?D?D已經可以支援多線程了,這就意味著可以大大提升複製速度。而且該功能可以建立兩個檔案結構完全的鏡像副本而不複製任何不需要的重複檔案,同時還允許您保留所有相關檔案資訊,包括日期和時間戳記、安全存取控制清單(ACL))等等。對那種N多小檔案目錄的複製能把速度提高一個數量級 ,幾千個檔案3秒就複製完了,而常用的複製粘貼方式大概需要45秒。
例如要把光碟片F:裡的所有檔案拷貝到E盤的CD目錄下,雨林木風系統可以運行以下命令:
Robocopy /s F: E:CD
即使此時突然取出光碟片,也無妨,robocopy 會一直等待,直到把光碟片重新放入光碟機又會自動開始拷貝。
Robocopy 還支援區域網路拷貝,甚至可以把區域網路伺服器中指定目錄的目錄結構全部搬到本地,robocopy 支援在定時操作,就可以把複製的操作放到晚上進行,以免擁塞區域網路,給別人帶來不便。
下面先看看這條命令的用法,如下圖所示:
如:RoBoCopy dir_from dir_to /E /MT:50 /LOG:copy.log
其中/E表示包含子目錄,/MT:50是用50個線程(預設8個線程,最大可設128個),/LOG是重新導向輸出。更多選項可以用robocopy /?查看。
命令文法:ROBOCOPY source destination [file [file]...] [options]
源:來源目錄(磁碟機:路徑或伺服器共用路徑)
目標:目標目錄(磁碟機:路徑 或 伺服器共用路徑)
檔案:要複製的檔案(名稱/萬用字元: 預設為 "*.*")
為了測試複製檔案的速度,做了如下的測試
能夠從上圖中看到在120個線程的情況下,複製大小為878.16MB的單個檔案,從14:56:31開始,14:57:06結束,共用了35秒得時間。
小路工作室(www.wzlu.com)建議為了能夠測試在選取多少線程數可以更快速的拷貝檔案,採用PowerShell指令碼進行批處理逐個測試不同線程的情況下複製所需要的時間與線程的對應關係,並將其在座標上描點作圖,測試的PowerShell指令碼如下:
for($i=128;$i ?Clt 129;$i++){
Robocopy /s C:CD C:testCD$i /MT:$i /LOG:log/copy$i.log
remove-item C:testCD$i*.*
"$i ," >>log/answ.txt
(Get-Content C:logcopy$i.log -TotalCount 6)[-1] >>log/answ.txt
"," >>log/answ.txt
(Get-Content C:logcopy$i.log -TotalCount 10000)[-1] >>log/answ.txt}
將指令碼輸出的內容經過格式規整,通過CSV格式匯入到Excel中,並作出折線圖如下圖中所示的“系列1”線條:
拷貝的目標目錄中共有324個檔案,單個檔案大小介於1MB與2MB之間,總檔案大小549MB,與上面大小為878.16MB的單個檔案相比,拷貝的時間要比之前要長,因為檔案數眾多,需要逐個進行拷貝花費了比較長的時間,而且經過多次實驗實驗當中是會有誤差的,歸一化後如圖中黃色的“線性(系列1)”線條所示,能夠看到同樣的檔案組在使用不同的線程時拷貝速度是有差異的,隨著線程數的增多,拷貝的時間呈線性減少。
其實 robocopy 還有很多強大的使用方法,讀者可以使用 robocopy /? 命令進行查詢,或者從本文末尾的附件中查看 RoboCopy 命令的詳細選項,從中讀者將會發現這條命令更強大的功能選項。
附:RoboCopy 命令的詳細選項
複製選項
/S:複製子目錄,但不複製空的子目錄。
/E:複製子目錄,包括空的子目錄。
/LEV:n:僅複製來源目錄樹的前 n 層。
/Z:在可重新啟動模式下複製檔案。
/B:在備份模式下複製檔案。
/ZB:使用可重新啟動模式;如果拒絕訪問,請使用備份模式。
/EFSRAW:在 EFS RAW 模式下複製所有加密的檔案。
/COPY:複製標記:: 要複製的檔案內容(預設為 /COPY:DAT)。(複製標記: D=資料,A=屬性,T=時間戳記)。(S=安全=NTFS ACL,O=所有者資訊,U=審核資訊)。
/DCOPY:T:複製目錄時間戳記。
/SEC:複製具有安全性的檔案(等同於 /COPY:DATS)。
/COPYALL:複製所有檔案資訊(等同於 /COPY:DATSOU)。
/NOCOPY:不複製任何檔案資訊(與 /PURGE 一起使用生效)。
/SECFIX:修複所有檔案的檔案安全性,即使是跳過的檔案。
/TIMFIX:修複所有檔案的檔案時間,即使是跳過的檔案。
/PURGE:刪除源中不再存在的目標檔案/目錄。
/MIR:鏡像分類樹(等同於 /E 和 /PURGE)。
/MOV:移動檔案(複製後從源中刪除)。
/MOVE:移動檔案和目錄(複製後從源中刪除)。
/A+:[RASHCNET]:將給定的屬性添加到複製檔案。
/A-:[RASHCNET]:從複製檔案中刪除給定的屬性。
/CREATE:僅建立分類樹和長度為零的檔案。
/FAT:僅使用 8.3 FAT 檔案名稱建立目標檔案。
/256:關閉超長路徑(> 256 字元)支援。
/MON:n:監視源;發現多於 n 個更改時再次運行。
/MOT:m:監視源;如果更改,在 m 分鐘時間內再次運行。
/RH:hhmm-hhmm:運行小時數 - 可以啟動新副本的時間。
/PF:以每個檔案(而不是每個步驟)為基礎檢查運行小時數。
/IPG:n:程式包間的間距(ms),以釋放低速線路上的頻寬。
/SL:對照目標複製符號連結。
/MT[:n]:使用 n 個線程進行多線程複製(預設值為 8)。n 必須至少為 1,但不得大於 128。該選項與 /IPG 和 /EFSRAW 選項不相容。使用 /LOG 選項重新導向輸出以便獲得最佳效能。
檔案選擇選項
/A:僅複製具有存檔屬性集的檔案。
/M:僅複製具有存檔屬性的檔案並重設存檔屬性。
/IA:[RASHCNETO]:僅包含具有任意給定屬性集的檔案。
/XA:[RASHCNETO]:排除具有任意給定屬性集的檔案。
/XF 檔案[檔案]...:排除與給定名稱/路徑/萬用字元匹配的檔案。
/XD 目錄[目錄]...:排除與給定名稱/路徑匹配的目錄。
/XC:排除已更改的檔案。
/XN:排除較新的檔案。
/XO:排除較舊的檔案。
/XX:排除多餘的檔案和目錄。
/XL:排除孤立的檔案和目錄。
/IS:包含相同檔案。
/IT:包含已調整的檔案。
/MAX:n:最大的檔案大小 - 排除大於 n 位元組的檔案。
/MIN:n:最小的檔案大小 - 排除小於 n 位元組的檔案。
/MAXAGE:n:最長的檔案存在時間 - 排除早於 n 天/日期的檔案。
/MINAGE:n:最短的檔案存在時間 - 排除晚於 n 天/日期的檔案。
/MAXLAD:n:最大的最後訪問日期 - 排除自 n 以來未使用的檔案。
/MINLAD:n:最小的最後訪問日期 - 排除自 n 以來使用的檔案。(If n <1900 then n = n days, else n = YYYYMMDD date)。
/XJ:排除接合點。(預設情況下通常包括)。
/FFT:假設 FAT 檔案時間(2 秒粒度)。
/DST:彌補 1 小時的 DST 時間差。
/XJD:排除目錄的接合點。
/XJF:排除檔案的接合點。
重試選項
/R:n:失敗副本的重試次數: 預設為 1 百萬。
/W:n:兩次重試間的等待時間: 預設為 30 秒。
/REG:將註冊表中的 /R:n 和 /W:n 儲存為預設設定。
/TBD:等待定義共用名稱(重試錯誤 67)。
日誌記錄選項
/L:僅列出 - 不複製、新增時間戳記或刪除任何檔案。
/X:報告所有多餘的檔案,而不只是選中的檔案。
/V:產生詳細輸出,同時顯示跳過的檔案。
/TS:在輸出中包含源檔案的時間戳記。
/FP:在輸出中包含檔案的完整路徑名稱。
/BYTES:以位元組列印大小。
/NS:無大小 - 不記錄檔案大小。
/NC:無類別 - 不記錄檔案類別。
/NFL:無檔案清單 - 不記錄檔案名稱。
/NDL:無目錄列表 - 不記錄目錄名稱。
/NP:無進度 - 不顯示已複製的百分比。
/ETA:顯示複製檔案的預期到達時間。
/LOG:檔案:將狀態輸出到記錄檔(覆蓋現有日誌)。
/LOG+:檔案:將狀態輸出到記錄檔(附加到現有日誌中)。
/UNILOG:檔案:以 UNICODE 方式將狀態輸出到記錄檔(覆蓋現有日誌)。
/UNILOG+:檔案:以 UNICODE 方式將狀態輸出到記錄檔(附加到現有日誌中)。
/TEE:輸出到控制台視窗和記錄檔。
/NJS:沒有作業摘要。
/UNICODE:以 UNICODE 方式輸出狀態。
作業選項
/JOB:作業名稱:從命名的作業檔案中提取參數。
/SAVE:作業名稱:將參數儲存到命名的作業檔案。
/QUIT:處理命令列後退出(以查看參數)。
/NOSD:未指定來源目錄。
/NODD:未指定目標目錄。
/IF:包含以下檔案。