Linux C 實現mycp 可以顯示檔案拷貝進度

2021-07-03 20:21:06 字數 4830 閱讀 3566

在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 ...