搜索
您的当前位置:首页正文

修改完成cp命令--------(linux下的文件操做)

来源:二三娱乐
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#define BUFFER_SIZE 128
//文件复制
int cover(char* src_file,char* dst_file)
{
    int n=0;
    int src_fd=0;
    int dst_fd=0;
    char buf[BUFFER_SIZE]={'\0'};
    if((src_fd = open(src_file,O_RDONLY)) == -1)
    {
        perror("open error");
        return 1;
    }
    if((dst_fd = open(dst_file,O_WRONLY )) == -1)
    {
        perror("open error");
        return 1;
    }
    while((n=read(src_fd,buf,BUFFER_SIZE))>0)
    {
    write(dst_fd,buf,n);
    }   
    close(dst_fd);
    close(src_fd);
    printf("覆盖完成!!!\n");
    sleep(2);
return 0;
}

int newbuilt(char* src_file,char* dst_file)
{
    int src_fd = 0;
    int dst_fd = 0;
    int n=0;
    char buf[BUFFER_SIZE]={'\0'};

    //1.open
    if((src_fd = open(src_file,O_RDONLY)) == -1)
    {
        perror("open error");
        return 1;
    }
    if((dst_fd = open(dst_file,O_WRONLY | O_CREAT | O_TRUNC,S_IRUSR | S_IWUSR)) == -1)
    {
        perror("open error");
        return 1;
    }
    //2.1 read data from src_file,知道读到源文件的尾部为止
    //2.2 write data to dst_file
    while((n=read(src_fd,buf,BUFFER_SIZE))>0)
    {
        write(dst_fd,buf,n);
    }
    //3.close
    close(dst_fd);
    close(src_fd);
    return 0;
}
//主程序
int main(int argc,char *argv[])
{
    //int access(const char *path,int mode);
    if(argc !=3)
    {
        printf("usage : %s dirname\n",argv[0]);
        return 0;
    }
    char* src_file = argv[1];
    char* dst_file = argv[2];
    
    if(access(dst_file,F_OK) == 0)
    {
        printf("文件存在,请选择复制方式:\n");
        int choice = 0;
        
        while(1)
        {
        system("clear");
        printf("\t\t***********************\n");
        printf("\t\t\t1.覆盖文件\n");
        printf("\t\t\t2.不覆盖文件\n");
        printf("\t\t\t3.退出操作\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                cover(src_file,dst_file);
                return;
            case 2:
                printf("请输入新的文件名:");
                char arr[32]="\0";
                scanf("%s",arr);
                newbuilt(src_file,arr);
                
                return;
            case 3:
                return;
            default:
                printf("输入有误,请重新输入!!!");
        }
    }
    }
    else
    {
        printf("文件不存在,正在进行复制操作\n");
        sleep(2);
        newbuilt(src_file,dst_file);
    }
}

//1.打开原文件
//2.判断目的文件是否存在
//3.如果目的存在,提示是否覆盖
//4.如果选择覆盖,则以只写的方式打开,并截短文件(O_TRUNC)
//5.如果选择不覆盖,则提醒输入新的保存文件名,并以只写方式打开
//6.循环读取源文件内容,写入到目的文件中
//7.关闭以打开的文件
//思考题:1:能否关闭标准输入文件、标准输出文件、标准输出文件?

//练习:getopt函数
//实现一个简单的ls命令,实现-a和-l功能
//将上述的代码修改成普通的ls命令(即不显示隐藏文件)
//strncmp
//-l stat
/*
int stat (const char* restrict path,struct stat *restrict buf)
//参数:
// path :待获取信息的文件或目录的路径
// buf:接受该文件详细的结构体的地址值

struct stat file_stat;
stat("/home/",&file_stat);
printf("%s",stat.st_link);
*/

Top