将一个文件的数据复制到另一个文件

时间:2014-09-18 11:17:30

标签: c file unix copy

我正在尝试使用“C”将数据从一个文件复制到UNix中的另一个文件。复制期间的条件是1)源文件不退出2)源文件存在但目标文件存在。 3)如果源和目标两个文件都存在,则选择覆盖目标文件或将源文件数据附加到目标文件数据。

以下代码适用于前两种情况。但不适用于最后一种情况(覆盖和追加)。当我执行程序并输入现有的源文件时,目标文件位置选择程序说数据已被附加的任一选项,但实际上数据不会被附加或覆盖。

请告诉我如何使程序在最后一个案例中正常工作。

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>

#define BUFFSIZE 512
#define PERM 0644

int main (int argc, char *argv[])
{
    char buffer[BUFFSIZE];
    int infile;
    int outfile;
    int choice;
    size_t size;

    if((infile = open(argv[1], O_RDONLY,0)) < 0)
    {
        printf("Source file does not exist\n");
        return -1;
    }

    if((outfile=open(argv[2],O_WRONLY,PERM))>0)

    {
        //  printf("Destination Fiel Exists , Do you wish to Overwrite or Appened destination file Data :   \n Enter 1 to overwrite or ,\n 0 to Append \n");
        scanf("%d",&choice);

        if(choice==1)
        {
            if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_EXCL, PERM))>=0)
            {
                printf("Destination file data is overwriten by source file data \n");
                return -2;
            }
        }// end if (choice =1)

        else
        {
            if(choice==0)
            {
                if((outfile=open(argv[2],O_WRONLY |O_CREAT |O_APPEND, PERM ))>=0)
                {
                    printf("Destination file data is appended with source file data : \n");
                }
            } // end if(choice==0)

            else
            {
                printf("Entered invalid choice.: \n");
            }
            return -3;
        }
    }
    else
    {
        if((outfile=open(argv[2],O_WRONLY | O_CREAT | O_EXCL,PERM))<0)
        {
            printf("Enter the desitination file along with source file \n");
            return -4;
        }
        else {
            printf(" Data has been copied to \t%s\n", argv[2]);
        }
    }

    while ((size=read(infile, buffer, BUFFSIZE)) > 0)
    {
        write(outfile, buffer, size);
    }

    close(infile);
    close(outfile);
    return 0;

}

2 个答案:

答案 0 :(得分:1)

   if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_EXCL, PERM))>=0)
   {
        printf("Destination file data is overwriten by source file data \n");
   }

// instead use 

   if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_TRUNC, PERM))>=0)
   {
        printf("Destination file data is overwriten by source file data \n");
   }

我想指出几点:

  1. 尝试覆盖目标文件时,需要使用O_TRUNC 而不是O_EXCL。这将确保目标文件数据的长度 变为0,然后将源文件复制到其中。
  2. 我也有 使用switch case而不是if-else子句来使它更容易 读
  3. 当您使用'return'时,控件将返回到main 其余的陈述将不会被执行。
  4. 您可以使用fread()和fwrite()来更快地完成任务。

答案 1 :(得分:0)

<div>
  <ul>
    <li>abcd</li>
    <li>b</li>
    <li>cdefg</li>
    <li>d</li>
  </ul>
</div>

我想指出几点:

1)尝试覆盖目标文件时,您需要使用if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_EXCL, PERM))>=0) { printf("Destination file data is overwriten by source file data \n"); } // instead use if((outfile=open(argv[2],O_WRONLY|O_CREAT |O_TRUNC, PERM))>=0) { printf("Destination file data is overwriten by source file data \n"); } 而不是O_TRUNC。这将确保目标文件数据的长度为0,然后将源文件复制到其中。

2)我也使用了switch case而不是if-else子句来使它更容易阅读。

3)当你使用O_EXCL时,控件返回到main,其余的语句将不会被执行。您可以使用returnfread()来更快地完成任务。