在Linux系統(tǒng)里面用到 cp命令復制不能顯示文件拷貝的進度,也不能計算還有多長時間文件可以 拷貝結束,現(xiàn)在寫一個程序可以顯示文件拷貝的進度。
創(chuàng)新互聯(lián)服務項目包括亞東網(wǎng)站建設、亞東網(wǎng)站制作、亞東網(wǎng)頁制作以及亞東網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,亞東網(wǎng)站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到亞東省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
思路:當前目錄下面有一個1G大小的bigfile文件
當我在命令行下面輸入ls -lh bigfile,我會得到這個文件的詳細信息,當然也可以看到文件的大小。
ls -lh bigfile
-rw-rw-r-- 1 nii nii 1000M 7月 13 19:41 bigfile
我們可以用popen函數(shù),把執(zhí)行之后的結果”-rw-rw-r– 1 nii nii 1000M 7月 13 19:41 bigfil”這串字符串接收下來,我們可以提取出來表示文件大小的那段字符串,比如這個我們可以提取”1000”在用atoi函數(shù),把字符串轉換為int型數(shù)值1000(不了解popen函數(shù)和atoi函數(shù)的請自行學習),就可以獲得文件大小。
例如我的文件名字叫mycp.c,我執(zhí)行gcc -o mycp mycp.c生成一個mycp的可執(zhí)行文件。
接下來我在命令行上輸入./mycp bigfile destbigfile把當前目錄下面的bigfile文件拷貝為destbigfile,這時我產生一個子進程,子進程負責調用系統(tǒng)的cp命令拷貝,父進程每隔一秒鐘,去獲取destbigfile、bigfile 文件的大小,就可以知道拷貝的進度,當然也可以獲得拷貝的時間,就可以計算出來離拷貝結束還有多長時間。
下面是代碼的實現(xiàn):
#include
#include
#include
#include
#include
#include
#include
/** 得到文件的詳細信息 */
int getFileMsg(char* pchCmd,char *pchMsg);
int main(int argc,char* argv[])
{
char szSrcFileMsg[150] = {0};
char szSrcFileSizeMsg[10] = {0};
int nSrcFileSize = 0;
char szSDestFileMsg[150] = {0};
char szDestFileSizeMsg[10] = {0};
int nDestFileSize = 0;
int pid = 0;
/** shell執(zhí)行的命令 ,在創(chuàng)建文件的時候使用*/
char szExcueCommand[150] = {0};
float fRate = 0;
int nUsedTime = 0;
float nLastTime = 0;
/** 入?yún)⒈仨毷侨齻€ */
if (1 == argc)
{
printf("please input the src and des file\n");
return -1;
}
/** 產生子進程 */
pid = fork();
/** 如果是子進程,負責執(zhí)行復制命令 */
if (0 == pid)
{
sprintf(szExcueCommand,"%s %s %s","cp",argv[1],argv[2]);
printf("%s\n",szExcueCommand);
system(szExcueCommand);
return 0;
}
/** 父進程負責把正在復制的原文件和復制的目標文件的大小計算出來,就可以知道復制的進度,計算頻率為1秒一次 */
else
{
/** 獲得原文件的大小 */
if (-1 == getFileMsg(argv[1],szSrcFileMsg))
{
printf("get sorce file message failed \n");
return -1;
}
/** 把原文件大小的信息取出來 */
strncpy(szSrcFileSizeMsg,szSrcFileMsg+21,4);
szSrcFileSizeMsg[5] = '\0';
nSrcFileSize = atoi(szSrcFileSizeMsg);
while(1)
{
sleep(1);
nUsedTime ++;
/** 獲得目標文件的大小 */
if (-1 == getFileMsg(argv[2],szSDestFileMsg))
{
printf("get dest file message failed \n");
return -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);
/** 復制完成之后,退出循環(huán) */
if (nSrcFileSize == nDestFileSize)
{
printf("復制完成,耗時 %d 秒\n",nUsedTime);
break;
}
}
}
return 0;
}
/** 得到文件的詳細信息 */
int getFileMsg(char* pchCmd,char *pchMsg)
{
FILE *fstream=NULL;
char szBuff[BUFSIZ] = {0};
char szExcueCommand[150] = {"ls -lh"};
sprintf(szExcueCommand,"%s %s",szExcueCommand,pchCmd);
if (NULL==(fstream=popen(szExcueCommand,"r")))
{
perror("execute command failed: ");
return -1;
}
/** 得到命令的結果 */
if (NULL == fgets(szBuff, sizeof(szBuff), fstream))
{
pclose(fstream);
return -1;
}
pclose(fstream);
strcpy(pchMsg,szBuff);
return 0;
}
Linux下執(zhí)行結果為:
./mycp bigfile destbigfile
cp bigfile 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 秒
cp命令可以拷貝 -r 包括下級 例如 復制aaa目錄 cp -r aaa/具體可以看看《linux就該這么學》
linux拷貝文件夾命令——CP命令。
格式:CP[選項]源文件或目錄目的文件或目錄。
選項說明:-b同名,備分原來的文件。-f強制覆蓋同名文件。-r按遞歸方式保留原目錄結構復制文件。
上述方法無法復制原始文本中的一些符號。
上述方法先打印后復制,可以將符號復制過去。
[1] linux命令模式下怎么把一個文本中的一行復制到另一個文本中?
[2] Linux里如何用管道和重新定向把一個文本里的指定行復制到另一個文本里去?
Linux復制命令用cp來進行復制操作。
1、首先需要打開Linux系統(tǒng),如圖所示,進入到主目錄。
2、在主目錄中創(chuàng)建一個students目錄,命令:mkdir students來做演示。
3、進入到students目錄中,如圖所示,再創(chuàng)建兩個目錄。
4、進入到fuzhi1目錄,用touch命令創(chuàng)建一個6.JPG文件。
5、用cp命令將6.JPG文件移動到fuzhi2目錄中。
6、用cd ~/students/fuzhi2命令進入到fuzhi2目錄中。
7、最后,用ls命令檢查JPG文件成功復制到fuzhi2目錄,這樣操作就可以看到已經復制成功。
常用的命令為# cp命令
方式一:對文件進行copy:
#cp object_file source_file
方式二:對目錄下文件進行copt:
#cp -r object_file source_file
補充cp的參數(shù):
用法:cp [選項]... [-T] 源文件 目標文件
或:cp [選項]... 源文件... 目錄
或:cp [選項]... -t 目錄 源文件...
將源文件復制至目標文件,或將多個源文件復制至目標目錄。
長選項必須使用的參數(shù)對于短選項時也是必需使用的。
-a, --archive 等于-dR --preserve=all
--backup[=CONTROL 為每個已存在的目標文件創(chuàng)建備份
-b 類似--backup 但不接受參數(shù)
--copy-contents 在遞歸處理是復制特殊文件內容
-d 等于--no-dereference --preserve=links
-f, --force 如果目標文件無法打開則將其移除并重試(當 -n 選項
存在時則不需再選此項)
-i, --interactive 覆蓋前詢問(使前面的 -n 選項失效)
-H 跟隨源文件中的命令行符號鏈接
-l, --link 鏈接文件而不復制
-L, --dereference 總是跟隨符號鏈接
-n, --no-clobber 不要覆蓋已存在的文件(使前面的 -i 選項失效)
-P, --no-dereference 不跟隨源文件中的符號鏈接
-p 等于--preserve=模式,所有權,時間戳。《Linux就該這么學》里有相關介紹,建議看看。