一、使用标准C库实现文件复制程序
1、数据准备
新建出testcp目录,然后在testcp目录中新建出src.txt
$ mkdir ~/testcp
$ cd ~/testcp
$ nano src.txt
内容如下:
a b c
d e f
1 2 3
2、编写C程序 my_copy.c
$ nano my_copy.c
内容如下:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#define SRC_PATH "/home/hadoop/testcp/src.txt"
#define TRG_PATH "/home/hadoop/testcp/target.txt"
#define BUF_SIZE 1024
int main(void){
FILE *fpSrc, *fpTrg;
int c = 0;
char buf[BUF_SIZE] = {0};
if((fpSrc = fopen(SRC_PATH, "rb")) == NULL){
printf("get src file failed\n");
return -1;
}
if((fpTrg = fopen(TRG_PATH, "wb")) == NULL){
printf("get target file failed\n");
return -1;
}
while((c = fread(buf, sizeof(char), BUF_SIZE, fpSrc)) > 0){
fwrite(buf, sizeof(char), c, fpTrg);
}
if(fclose(fpSrc) != 0)
puts("close src file failed!\n");
if(fclose(fpTrg) != 0)
puts("close target file failed!\n");
return 0;
}
3、编译C程序
$ gcc my_copy.c
编译成功后,ls查看编译生成了a.out文件
$ ls
a.out my_copy.c src.txt
4、执行a.out文件
$ ./a.out
查看结果生成了target.txt文件
$ ls
a.out my_copy.c src.txt target.txt
验证target.txt的内容是否与src.txt的内容一致,一致则为正确复制
$ cat target.txt
二、使用Linux系统函数实现文件复制程序
1、数据准备
新建testcp2目录,并在testcp2目录下新建src.dat文件
$ mkdir ~/testcp2
$ cd ~/testcp2
$ nano src.dat
src.dat文件内容如下:
a b c
d e f
123
456
2、编写C程序 my_copy2.c
#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define SRC_PATH "/home/hadoop/testcp2/src.dat"
#define TRG_PATH "/home/hadoop/testcp2/target.dat"
#define BUF_SIZE 1024
int main() {
char buf[BUF_SIZE] = {0};
int fdSrc, fdTrg;
int len;
fdSrc = open(SRC_PATH, O_RDWR | O_CREAT);
fdTrg = open(TRG_PATH, O_RDWR | O_CREAT);
while(len = read(fdSrc, buf, BUF_SIZE)){
write(fdTrg, buf, len);
}
if(close(fdSrc) != 0)
printf("close src file failed!\n");
if(close(fdTrg) != 0)
printf("colse target file failed!\n");
return 0;
}
3、编译
$ gcc my_copy2.c
4、执行
$ ./a.out
5、查看结果
$ ls
a.out my_copy2.c src.dat target.dat
$ ll
total 32
drwxrwxr-x 2 hadoop hadoop 4096 Mar 9 17:28 ./
drwxr-xr-x 10 hadoop hadoop 4096 Mar 9 17:22 ../
-rwxrwxr-x 1 hadoop hadoop 8872 Mar 9 17:28 a.out*
-rw-rw-r-- 1 hadoop hadoop 706 Mar 9 17:28 my_copy2.c
-rw-rw-r-- 1 hadoop hadoop 20 Mar 9 17:26 src.dat
--wxrwS--T 1 hadoop hadoop 20 Mar 9 17:28 target.dat*
hadoop@wangchi:~/testcp2$ sudo cat target.dat
[sudo] password for hadoop:
a b c
d e f
123
456
注意:复制之后src.dat与target.dat的权限不一致。
在执行一次
$ ll
-rw-rw-r-- 1 hadoop hadoop 20 Mar 9 17:26 src.dat
-rwxr----- 1 hadoop hadoop 20 Mar 9 17:43 target.dat*
在执行一次
-rw-rw-r-- 1 hadoop hadoop 20 Mar 9 17:26 src.dat
--w------- 1 hadoop hadoop 20 Mar 9 17:45 target.dat
发现每次执行权限都有变化(没有规律),但还是不一致。
经过验证,需要提前创建出target.dat文件,最后的权限才一致。
三、优化已实现的文件复制程序(优化题目一)
my_copy_update.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#define BUF_SIZE 1024
int main(int argc, char const *argv[]){
char const *src_path = argv[1];
char const *trg_path = argv[2];
FILE *fpSrc, *fpTrg;
int c = 0;
char buf[BUF_SIZE] = {0};
if((fpSrc = fopen(src_path, "r+")) == NULL){
printf("get src file failed\n");
return -1;
}
if((fpTrg = fopen(trg_path, "w+")) == NULL){
printf("get target file failed\n");
return -1;
}
while((c = fread(buf,sizeof(char),BUF_SIZE,fpSrc)) > 0){
fwrite(buf, sizeof(char), c, fpTrg);
}
if(fclose(fpSrc) != 0)
puts("close src file failed!\n");
if(fclose(fpTrg) != 0)
puts("close target file failed!\n");
return 0;
}
完成! enjoy it!