廢話不多說,開始正式新旅程吧。前陣子借助wpa_supplicant庫實現了模擬手機wifi的連線程式,可謂是步步荊棘。這個待我好好整理後再發出來。這次先記錄乙個很小的功能—在linux平台的qt環境下實現資料夾拷貝並且帶進度顯示的幾種方案。
專案需求是實現乙個自公升級功能,其實就是用新的資料夾內容覆蓋原來的,但是需要有進度顯示。
文中提到乙個新的命令:rsync,用法如下:
$ rsync --progress a.exe a1.exe
a.exe
20461680
100% 38.35mb/s 0:00:00 (xfer#1, to-check=0/1)
sent 20464246
bytes received 31
bytes
13642851.33
bytes/sec
total size is 20461680 speedup is 1.00
筆者把a.exe複製成a3,命令下面的是輸出資訊。加了progress 選項輸出內容還是非常詳細的,包括進度,速度等。進度和速度都是不斷變化的。所以只要提取命令的輸出資訊即可得到拷貝的進度。那麼如何得到linux命令的反饋資訊呢?這裡我們可以使用linux的管道–pipe來實現。提供一段參考**:
char num[5];
char command[100] = "rsync --progress a.zip a4";
int main()
while(1)
}else
usleep(2);
}pclose(pipe);
}
剩下的就很簡單了,只要提取%前面的數字就可以了,這裡推薦使用正規表示式。
本以為做到這裡就能實現了,結果使用這個命令拷貝資料夾時候發現它並不是輸出整體的進度,而是輸出每個檔案的拷貝進度,這樣肯定是不符合我們需求的。所以,這種方案只適合單個檔案,並不適合資料夾。
既然純用命令不行,筆者又想了個迂迴方案。用cp+執行緒實現。具體思想如下:
先記錄待拷貝資料夾總大小執行cp命令開始拷貝
開始拷貝後立刻啟動乙個執行緒,執行緒工作就是不停計算拷貝的資料夾大小,然後和記錄的總大小計算進度,返回給主程序處理。
quint64 progressthread::du(const qstring &path)
foreach (qstring subdir, dir.entrylist(qdir::dirs | qdir::nodotanddotdot))
return
size;
}
path是待資料夾路徑,實測過程中還有乙個問題,由於cp命令是阻塞式,所以是以先執行命令,後開啟統計執行緒的順序執行,會造成拷貝完了以後執行緒才啟動。所以可以先開啟執行緒,再執行拷貝,當然最好的方案應該是兩個操作都處理成執行緒,這樣不用擔心阻塞問題,還不會影響qt的ui響應。
也就是純程式實現了,這個無非是把cp的命令轉換為程式實現,基本上就是遞迴拷貝,然後每拷貝完乙個檔案呼叫上面的統計程式進行計算拷貝進度。筆者沒有親測,只是預想了方案,當然,論靈活性當然是這個方案最高。但是沒必要再造輪子不是嗎,第二種方案還是比較簡單可行的。
linux 資料夾拷貝並覆蓋
踩了個坑,做一下筆記。先了解一下linux 拷貝命令 1 命行 cp man 如下圖所示。2 從說明大概可以知道,輸入 cp af 源目錄 目標目錄就可達到覆蓋拷貝的效果。但實際上並沒有。如下圖所示,還是有覆蓋的提示。3 網上找一了一下,才發現正確的命令是 cp af 源目錄 目標目錄,關鍵是 cp...
C 拷貝資料夾到指定資料夾並更改資料夾名稱
using system using system.collections.generic using system.text namespace clientprintserver.tools 判斷目標目錄是否存在如果不存在則新建 if system.io.directory.exists aim...
拷貝資料夾
需要引用命名空間 using system.io 拷貝資料夾 包括子資料夾 到指定資料夾下,源資料夾和目標資料夾均需絕對路徑.格式 copyfolder 源資料夾,目標資料夾 public static void copyfolder string strfrompath,string strtop...