c语言实现cp命令

本文深入探讨了使用C语言进行文件复制的过程,包括从源文件读取数据并将其写入目标文件的具体实现。文章详细解释了如何利用系统调用如open、read、write和close来完成复制任务,并讨论了在复制过程中遇到的常见问题,如文件大小预判、文件夹路径补全及文件权限调整等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/types.h>
#include<string.h>

//Function:
//实现的cp功能 可以从文件复制到指定文件夹下 但是没有实现带参数cp
//另外如果多次复制并不会提示是否两者都保存,直接删除原文件重新复制
//另外注意在文件夹下创建的文件可能带有文件夹锁,导致下一次复制访问该文件失败


int main(int argc, char *argv[])
{
	int fd,fd1,size;
	int readnumber,writenumber;
	struct stat statbuf,statbuf1; 
	char tempor[1024];
	if(argc != 3)
	{
		printf("please enter the right source and destination:\n");
		return 0;
	}

	fd = open(argv[1],O_RDONLY,777);
	if(fd < 0)
	{
		perror("open wrong!");
		return 0;
	}

//怎样事先判断文件的大小呢

//这里有个好方法 用stat结构读取
	stat(argv[1],&statbuf);
	size = statbuf.st_size;
	readnumber = read(fd,tempor,size);
	printf("you have read %d words \n",readnumber);

    //若输入的第二个是一个文件夹的路径,怎么写呢? fopen不是系统调用函数,使用的话内外核切换浪费很大
    //如果目标文件是一个目录,那么我的方法是将其文件夹路径补全为一个文件路径*/
    stat(argv[2],&statbuf1);
    //这里有一个错误,就是不进行判断,直接都走else了,但是我真的累了,找不出来
    if(S_ISDIR(statbuf1.st_mode) != 0)
    {
    	//这里注意当第一个参数不是路径而只是一个文件的时候的情况
    	if(S_ISDIR(statbuf.st_mode))//等于0的话是文件
    	{
	    	char ch = '/';
	    	char *q = strrchr(argv[1],ch);
	    	printf("%s\n", q);
	    	strcat(argv[2],q);//连接字符串函数,即自动将路径补全了

    	}else 
    	{
    		char *p = "/";
    		strcat(argv[2],p);
    		strcat(argv[2],argv[1]);
    	 }
    }
}
	chmod(argv[2],S_IRUSR|S_IWUSR);
	printf("%s\n",argv[2] );
	fd1 = open(argv[2],O_WRONLY|O_CREAT,777);
	//注意这里若文件存在的话会报错,原因ubuntuyou 文件夹锁,创造的文件只能读,修改一下权限就好了	
	if(fd1 < 0)
	{
		perror("open wrong!");
		return 0;
	}
 
	writenumber = write(fd1,tempor,readnumber);
	printf("you have write %d words \n",writenumber);


	close(fd); 
	close(fd1);


	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值