在linux系統裡面用到 cp命令複製不能顯示檔案拷貝的進度,也不能計算還有多長時間檔案可以 拷貝結束,現在寫乙個程式可以顯示檔案拷貝的進度。
思路:當前目錄下面有乙個1g大小的bigfile檔案
當我在命令列下面輸入ls -lh bigfile,我會得到這個檔案的詳細資訊,當然也可以看到檔案的大小。
nii@ww:~$ ls -lh bigfile
-rw-rw
-r--
1 nii nii 1000m 7月 13
19:41 bigfile
我們可以用popen函式,把執行之後的結果」-rw-rw-r– 1 nii nii 1000m 7月 13 19:41 bigfil」這串字串接收下來,我們可以提取出來表示檔案大小的那段字串,比如這個我們可以提取」1000」在用atoi函式,把字串轉換為int型數值1000(不了解popen函式和atoi函式的請自行學習),就可以獲得檔案大小。
例如我的檔案名字叫mycp.c,我執行gcc -o mycp mycp.c生成乙個mycp的可執行檔案。
接下來我在命令列上輸入./mycp bigfile destbigfile把當前目錄下面的bigfile檔案拷貝為destbigfile,這時我產生乙個子程序,子程序負責呼叫系統的cp命令拷貝,父程序每隔一秒鐘,去獲取destbigfile、bigfile 檔案的大小,就可以知道拷貝的進度,當然也可以獲得拷貝的時間,就可以計算出來離拷貝結束還有多長時間。
下面是**的實現:
#include #include #include #include #include #include #include /** 得到檔案的詳細資訊 */
int getfilemsg(char* pchcmd,char *pchmsg);
int main(int argc,char* argv)
; char szsrcfilesizemsg[10] = ;
int nsrcfilesize = 0;
char szsdestfilemsg[150] = ;
char szdestfilesizemsg[10] = ;
int ndestfilesize = 0;
int pid = 0;
/** shell執行的命令 ,在建立檔案的時候使用*/
char szexcuecommand[150] = ;
float frate = 0;
int nusedtime = 0;
float nlasttime = 0;
/** 入參必須是三個 */
if (1 == argc)
/** 產生子程序 */
pid = fork();
/** 如果是子程序,負責執行複製命令 */
if (0 == pid)
/** 父程序負責把正在複製的原檔案和複製的目標檔案的大小計算出來,就可以知道複製的進度,計算頻率為1秒一次 */
else
/** 把原檔案大小的資訊取出來 */
strncpy(szsrcfilesizemsg,szsrcfilemsg+21,4);
szsrcfilesizemsg[5] = '\0';
nsrcfilesize = atoi(szsrcfilesizemsg);
while(1)
/** 把原檔案大小的資訊取出來 */
strncpy(szdestfilesizemsg,szsdestfilemsg+21,4);
szdestfilesizemsg[5] = '\0';
ndestfilesize = atoi(szdestfilesizemsg);
/*** 計算複製的進度 */
frate = (ndestfilesize * 100) / nsrcfilesize ;
/** 計算剩下的時間 */
nlasttime = ((100 - frate) * nusedtime) / frate;
/** 列印進度條 */
printf("已複製 %.2f %% 還需要 %.1f 秒\n",frate,nlasttime);
/** 複製完成之後,退出迴圈 */
if (nsrcfilesize == ndestfilesize)
}}
return0;}
/** 得到檔案的詳細資訊 */
int getfilemsg(char* pchcmd,char *pchmsg)
; char szexcuecommand[150] = ;
sprintf(szexcuecommand,"%s %s",szexcuecommand,pchcmd);
if (null==(fstream=popen(szexcuecommand,"r")))
/** 得到命令的結果 */
if (null == fgets(szbuff, sizeof(szbuff), fstream))
pclose(fstream);
strcpy(pchmsg,szbuff);
return
0;}
linux下執行結果為:
nii@ww:~/advance_code/homework/signal$ ./mycp
bigfile
destbigfile
cpbigfile
destbigfile
已複製 3.00
% 還需要 32.3 秒
已複製 5.00
% 還需要 38.0 秒
已複製 8.00
% 還需要 34.5 秒
已複製 10.00
% 還需要 36.0 秒
已複製 12.00
% 還需要 36.7 秒
已複製 13.00
% 還需要 40.2 秒
已複製 14.00
% 還需要 43.0 秒
已複製 17.00
% 還需要 39.1 秒
已複製 20.00
% 還需要 36.0 秒
已複製 21.00
% 還需要 37.6 秒
已複製 24.00
% 還需要 34.8 秒
已複製 24.00
% 還需要 38.0 秒
已複製 27.00
% 還需要 35.1 秒
已複製 32.00
% 還需要 29.8 秒
已複製 33.00
% 還需要 30.5 秒
已複製 35.00
% 還需要 29.7 秒
已複製 38.00
% 還需要 27.7 秒
已複製 41.00
% 還需要 25.9 秒
已複製 42.00
% 還需要 26.2 秒
已複製 43.00
% 還需要 26.5 秒
已複製 44.00
% 還需要 26.7 秒
已複製 48.00
% 還需要 23.8 秒
已複製 50.00
% 還需要 23.0 秒
已複製 52.00
% 還需要 22.2 秒
已複製 53.00
% 還需要 22.2 秒
已複製 53.00
% 還需要 23.1 秒
已複製 57.00
% 還需要 20.4 秒
已複製 59.00
% 還需要 19.5 秒
已複製 61.00
% 還需要 18.5 秒
已複製 63.00
% 還需要 17.6 秒
已複製 63.00
% 還需要 18.2 秒
已複製 66.00
% 還需要 16.5 秒
已複製 69.00
% 還需要 14.8 秒
已複製 70.00
% 還需要 14.6 秒
已複製 72.00
% 還需要 13.6 秒
已複製 73.00
% 還需要 13.3 秒
已複製 75.00
% 還需要 12.3 秒
已複製 78.00
% 還需要 10.7 秒
已複製 79.00
% 還需要 10.4 秒
已複製 82.00
% 還需要 8.8 秒
已複製 83.00
% 還需要 8.4 秒
已複製 84.00
% 還需要 8.0 秒
已複製 87.00
% 還需要 6.4 秒
已複製 90.00
% 還需要 4.9 秒
已複製 91.00
% 還需要 4.5 秒
已複製 93.00
% 還需要 3.5 秒
已複製 93.00
% 還需要 3.5 秒
已複製 96.00
% 還需要 2.0 秒
已複製 99.00
% 還需要 0.5 秒
已複製 100.00
% 還需要 0.0 秒
複製完成,耗時 50 秒
linux c實現簡單shell
簡單的模擬shell,可以執行帶乙個輸入重定向 或輸出重定向或管道 命令,程式存在不完善之處,基本能用 include include include include include include include include includechar command 100 存放命令 char ...
linux c 實現 ls 命令
include include include include include include ctime 函式 include 操作目錄 include 操作檔案 include 獲取檔案所有者 include infomodeall a infomodedetail l 顯示資訊模式 typed...
linux C實現執行緒池
執行緒池包括任務佇列,執行緒陣列,管理模組幾個部分,依次實現這幾個模組 typedef struct tk tasktk task t 任務佇列,用單鏈表的方式實現 執行緒池的管理模組用以下 typedef struct threadpooltk threadpool t 要實現以下幾個方法 tk ...