linux文件拷貝c語言
1,首先需要了解cp的原理。
2,可以參考cp的源碼去了解其原理
3,cp命令的源碼可以在linux內核中找到。
4,或者下載busybox其中也會有cp的源碼
只有了解其原理之後才能談如何實現。參考代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<string.h>
#defineBUF_SIZE1024
#definePATH_LEN128
voidmy_err(char*err_string,intline)
{
fprintf(stderr,"line:%d",line);
perror(err_string);
exit(1);
}
void_data(constintfrd,constintfwd)
{
intread_len=0,write_len=0;
unsignedcharbuf[BUF_SIZE],*p_buf;
while((read_len=read(frd,buf,BUF_SIZE))){
if(-1==read_len){
my_err("Readerror",__LINE__);
}
elseif(read_len>0){//把讀取部分寫入目標文件
p_buf=buf;
while((write_len=write(fwd,p_buf,read_len))){
if(write_len==read_len){
break;
}
elseif(write_len>0){//只寫入部分
p_buf+=write_len;
read_len-=write_len;
}
elseif(-1==write_len){
my_err("Writeerror",__LINE__);
}
}
if(-1==write_len)break;
}
}
}
intmain(intargc,char**argv)
{
intfrd,fwd;//讀寫文件描述符
intlen=0;
char*pSrc,*pDes;//分別指向源文件路徑和目標文件路徑
structstatsrc_st,des_st;
if(argc<3){
printf("用法./MyCp<源文件路徑><目標文件路徑> ");
my_err("argumentserror",__LINE__);
}
frd=open(argv[1],O_RDONLY);
if(frd==-1){
my_err("Cannotopnefile",__LINE__);
}
if(fstat(frd,&src_st)==-1){
my_err("staterror",__LINE__);
}
/*檢查源文件路徑是否是目錄*/
if(S_ISDIR(src_st.st_mode)){
my_err("略過目錄",__LINE__);
}
pDes=argv[2];
stat(argv[2],&des_st);
if(S_ISDIR(des_st.st_mode)){//目標路徑是目錄,則使用源文件的文件名
len=strlen(argv[1]);
pSrc=argv[1]+(len-1);//指向最後一個字元
/*先找出源文件的文件名*/
while(pSrc>=argv[1]&&*pSrc!='/'){
pSrc--;
}
pSrc++;//指向源文件名
len=strlen(argv[2]);
//.表示復制到當前工作目錄
if(1==len&&'.'==*(argv[2])){
len=0;//沒有申請空間,後面就不用釋放
pDes=pSrc;
}
else{//復制到某目錄下,使用源文件名
pDes=(char*)malloc(sizeof(char)*PATH_LEN);
if(NULL==pDes){
my_err("mallocerror",__LINE__);
}
strcpy(pDes,argv[2]);
if(*(pDes+(len-1))!='/'){//目錄缺少最後的'/',則補上』/『
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*打開目標文件,使許可權與源文件相同*/
fwd=open(pDes,O_WRONLY|O_CREAT|O_TRUNC,src_st.st_mode);
if(fwd==-1){
my_err("Cannotcreatfile",__LINE__);
}
_data(frd,fwd);
//puts("endof");
if(len>0&&pDes!=NULL)
free(pDes);
close(frd);
close(fwd);
return0;
}
『貳』 濡備綍灝唋inux涓鐨刢璇璦澶嶅埗鍑烘潵
鏂囦歡淇濆瓨鍒癠鐩樺氨鍙浠ャ備篃鍙浠ラ氳繃緗戠粶鍏變韓銆
『叄』 在linux下,寫一個c語言程序把一個文件的內容寫入另一個文件中
#include<stdio.h>
main()
{
FILE*fi,*fo;
charc;
fi=fopen("input","r");
fo=fopen("output","w");
while(fscanf(fi,"%c",&c)!=EOF)
fprintf(fo,"%c",c);
fclose(fi);
fclose(fo);
}
『肆』 在linux下如何用c語言實現在伺服器接受文件的時候轉發給另一個伺服器
題目說得比較清楚,但問題說明確讓人摸不著頭腦。
根據題目的意思,其實這個問題很好解決:一旦伺服器接收到文件後(接收程序是自己編寫的程序),則調用三方ftp的C語言庫,將文件ftp到另一個伺服器即可。
若伺服器接收文件不是通過自己寫的程序,如是通過NFS寫過來的,則需要專門寫一個簡單的同步程序,定時檢查指定目錄下的文件屬性,一旦發現有新文件,則ftp到另一個伺服器即可。
『伍』 怎麼用C語言復制文件或者移動文件,不要用system的命令。Linux命令cp cat都不行,我要
要求 c:\source.txt文件必須存在,可以自己建立一個這樣的文本文件,並輸入一些數據,以便測試。
復制文件:源文件c:\source.txt 復制到c:\dex.txt
#include<stdio.h>
void main()
{
FILE *fp1,*fp2;
char str1;
fp2=fopen("c:\\des.txt","w");
if((fp1=fopen("C:\\source.txt","r"))==NULL)
{
printf("file cannot be opened\n");
return;
}
while((str1=fgetc(fp1))!=EOF)
fputc(str1,fp2);
fclose(fp1);
fclose(fp2);
}
希望能夠幫到你。
移動文件:源文件c:\source.txt 移動到c:\dex.txt
#include<stdio.h>
void main()
{
FILE *fp1,*fp2;
char str1;
fp2=fopen("c:\\des.txt","w");
if((fp1=fopen("C:\\source.txt","r"))==NULL)
{
printf("file cannot be opened\n");
return;
}
while((str1=fgetc(fp1))!=EOF)
fputc(str1,fp2);
fclose(fp1);
fclose(fp2);
remove("c:\\source.txt");
}
『陸』 在Linux系統系下vi操作中C語言編程,如何進行復制粘貼求救!
在非輸入狀態下,復制命令是YY(對著你要復制的內容連旦蘆信續按兩下字母「Y」),粘帖是P 。
根據提問者補充:
如果是多行復制的話,命令是數字+YY,比如:
#vi test.c
row1
row2
row3
..........
rown
假如你要復制test.c中的row1到row3行,那就是把游標移動到row1那一行,然後在非輸入狀態下,先按一下「3」,再按YY,這樣就是多行復制了(註:你要復制模輪幾行,數字就是多少),以此類推,嘩慧舉一反三。
『柒』 Linux復制文件用什麼命令怎麼用
Linux中最常用命令之一就是cp了,用於復制文件夾或文件。下面由我為大家整理了Linux系統復制文件夾命令cp使用詳解,希望對大家有幫助!
Linux系統復制文件夾命令cp使用詳解
指令名稱:cp()
功能介紹:將一個文件復制至另一個文件,或將數個文件復制至另一目錄。
語法格式:
cp [options] source dest
cp [options] source... directory
常用參數說明:
-a 盡可能將檔案狀態、許可權等資料都照原狀予以復制。
-r 若 source 中含有目錄名,則將目錄下之檔案亦皆依序拷貝至目的地。
-f 若目的地已經有相同檔名的檔案存在,則在復制前先予以刪除再行復制。
Linux復制文件夾命令cp使用實例
1.將文件aaa 復制(已存在),並命名為bbb:
cp aaa bbb
2.將所有的C語言程序拷貝至 Finished 子目錄中 :
cp *.c Finished
3. 復制指定目錄的文件到當前目錄,並重命名
[root@rehat root]# cp ~/.bashrc bashrc_bak
4. 強制復制指定目錄的文件到當前目錄,而不管當前目錄是否含有該文件
[root@rehat root]# cp -f ~/.bashrc bashrc
5. 復制指定目錄到當前目錄
[root@rehat root]# cp -r /root/test .
[root@rehat root]# cp -r /root/test/ .
兩者效果一樣,在復制目錄時,會將源路徑的最後一級目錄全部復制過去,包括它本身。
6. 復制指定目錄的文件到指定目錄
[root@rehat root]# cp ~/.bashrc /bak/.bashrc
7. 在復制時將源文件的全部屬性也復制過來。若不指定參數,則目標文件與源文件屬性可能不一致。
[root@rehat root]# cp -a ~/.bashrc /bak/.bashrc
8. 若兩個文件夾要保證同步,一個文件的改了,另一個文件也跟著改,但是要保證兩個文件的文件都是最新的。
[root@rehat root]# cp -u /src/.bashrc /bak_src/bashrc
(7)linux文件拷貝c語言擴展閱讀:linux scp命令遠程復制文件夾
1、拷貝本機/home/administrator/test整個目錄至遠程主機192.168.1.100的/root目錄下
復制代碼代碼如下:
scp -r /home/administrator/test/ [email protected]:/root/
2、拷貝單個文件至遠程主機
復制代碼代碼如下:
scp /home/administrator/Desktop/old/driver/test/test.txt [email protected]:/root/
其實上傳文件和文件夾區別就在參數 -r, 跟cp, rm的參數使用差不多, 文加價多個 -r
3、遠程文件/文件夾下載
舉例,把192.168.62.10上面的/root/文件夾,下載到本地的/home/administrator/Desktop/new/下,使用遠程端的root登陸
復制代碼代碼如下:
scp -r [email protected]:/root/ /home/administrator/Desktop/new/