尝试将文件复制到目录。但文件清除了。 (C)

时间:2017-05-19 09:11:33

标签: c file-io

例如,我有一个文件test1.txt,里面有#34;这是一个测试文件"。 我有一个目录/ testDir。如果我将其作为./cp2 test1.txt / testDir运行 该程序将运行但test1.txt将变为空,并且/testDir/test1.text将变为空。任何人都可以识别我的代码中我在哪里覆盖两个文本文件的内容吗?

提前谢谢你。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>  // for strtol
#include <string.h>

#define COPYMODE 0644 
#define BUFFERSIZE 1024
void errExit(char*, char*);
void copyFile(char *src, char* dest) {

int srcFd;
int dstFd;
int charCnt;
    char buf[BUFFERSIZE];

/*Check args*/

/*Open the files*/
if( (srcFd=open(src, O_RDONLY)) == -1){
    errExit("Cannot open ", src);
}
if( (dstFd=creat(dest, COPYMODE)) ==-1) {
errExit("Cannot create ", dest);
}
/*Copy the data*/
while( (charCnt= read(srcFd, buf, BUFFERSIZE)) > 0 ){
    if( write(dstFd,buf,charCnt ) != charCnt ){
    errExit("Write error to ", dest);
}
}
if( charCnt==-1 ){
    errExit("Read error from ", src);
}

/*Close files*/
if ( close(srcFd) == -1 || close(dstFd) == -1 ){
    errExit("Error closing files","");
 }

}

main(int argC, char* argV[]) {

char* src = argV[1];
char* dest = argV[2];

if(src[0] != '/' && dest[0] != '/' ) {
copyFile(src, dest);
} else if(src[0] !='/' && dest[0] == '/') { //going to change this to check if its a dir or file.
int i;
for(i=1; i<=strlen(dest); i++) {
    dest[(i-1)] = dest[i];
        }

    strcat(dest, "/");
    strcat(dest, src);
    copyFile(dest, src);
  }
 }

1 个答案:

答案 0 :(得分:0)

有几个问题:

您对COPYMODE的定义是错误的,您需要这样:

#define COPYMODE S_IRWXU|S_IWUSR|S_IRGRP|S_IROTH

阅读creat

的文档

这可能不是一个好主意:

strcat(dest, "/");
strcat(dest, src);

在这里修改dest指向的字符串。这没关系,但只有当新字符串不长于dest指向的字符串时,才会有更多详细信息here

您需要为您构建的字符串添加另一个缓冲区:

char destfilename[300];
strcpy(destfilename, dest);
strcat(destfilename, "/");
strcat(destfilename, src);
copyFile(destfilename, src);