Linux文件复制
前言
实现Linux cp命令
cp指令是用于复制文件或目录的指令,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。
一、用到的各函数
用到的函数原型、返回值和作用的描述:
-
int open(const char *pathname, int flags, mode_t mode);
- 返回类型:
int
- 返回值:文件描述符(如果成功),出错时返回-1,并设置
errno
来指示错误原因。 - 作用:
open
函数用于打开文件。它接受一个文件路径pathname
,以及一些标志flags
,用于指定文件访问模式和文件状态。通过mode
参数,可以设置文件的权限,这在使用O_CREAT
标志创建文件时非常有用。
- 返回类型:
-
ssize_t read(int fd, void *buf, size_t count);
- 返回类型:
ssize_t
- 返回值:成功时返回读取的字节数,若已到达文件末尾则返回0,出错时返回-1,并设置
errno
来指示错误原因。 - 作用:
read
函数用于从文件中读取数据。它需要指定文件描述符fd
,读取的数据将存储在buf
缓冲区中,最多读取count
个字节的数据。成功读取后,返回实际读取的字节数。
- 返回类型:
-
off_t lseek(int fd, off_t offset, int whence);
- 返回类型:
off_t
- 返回值:返回新的文件偏移量(成功),出错时返回-1,并设置
errno
来指示错误原因。 - 作用:
lseek
函数用于移动文件读写位置。通过文件描述符fd
指定要操作的文件,offset
参数指定偏移量,而whence
参数则指定偏移量的参考位置。成功后,返回新的文件偏移量。
- 返回类型:
-
ssize_t write(int fd, const void *buf, size_t count);
- 返回类型:
ssize_t
- 返回值:成功时返回写入的字节数,出错时返回-1,并设置
errno
来指示错误原因。 - 作用:
write
函数用于向文件中写入数据。通过文件描述符fd
指定要写入的文件,要写入的数据存储在buf
缓冲区中,写入的字节数由count
指定。成功后,返回实际写入的字节数。
- 返回类型:
-
void perror(const char *s);
- 返回类型:
void
- 返回值:无。
- 作用:
perror
函数用于将上一个系统调用的错误输出到标准错误流,并加上自定义的错误消息前缀。它用于帮助定位错误的原因和位置。
- 返回类型:
-
void *malloc(size_t size);
- 返回类型:
void *
- 返回值:指向分配的内存块的指针,分配失败时返回NULL。
- 作用:
malloc
函数用于动态分配内存。它接受一个参数size
,表示要分配的内存大小(以字节为单位)。成功后,返回指向分配内存块的指针。如果分配失败,则返回NULL。
- 返回类型:
-
void free(void *ptr);
- 返回类型:
void
- 返回值:无。
- 作用:
free
函数用于释放先前通过malloc
函数动态分配的内存块。它接受一个指针ptr
,指向要释放的内存块。调用该函数后,该内存块将被释放,可以被重新分配使用。
- 返回类型:
-
void exit(int status);
- 返回类型:
void
- 返回值:无。
- 作用:
exit
函数用于正常或异常退出程序。它接受一个状态码status
,通常使用0表示成功,其他值表示错误。在退出程序之前,可以执行一些清理工作。
- 返回类型:
二、实现步骤
1.打开源文件
2.读源文件到缓冲区
3.创建目标文件
4.将缓冲区内容写入目标文件
5.关闭文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int fdSrc;//源文件标识符
int fdDes;//目标文件标识符
int bytes_read;
char *read_buf = NULL;
int bytes_write;
int Src_size;
if(argc != 3)//输入参数的个数
{
perror("pararm error\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);//打开源文件
Src_size = lseek(fdSrc, 0, SEEK_END);//将光标移动到文件的末尾,并返回文件的大小
lseek(fdSrc, 0, SEEK_SET);//重新将光标移动回文件的开头
read_buf = (char *)malloc(sizeof(char)*Src_size+8);//动态开辟缓冲区
bytes_read = read(fdSrc, read_buf, Src_size);//将源文件内容读入缓冲区,并返回实际读取文件的字节数
fdDes = open(argv[2],O_RDWR|O_CREAT,0600);//打开目标文件
bytes_write = write(fdDes, read_buf, strlen(read_buf));//将缓冲区内容写入目标文件
printf("copy success!!!\n");
close(fdSrc);//关闭文件
close(fdDes);
return 0;
}
在这里插入图片描述