例如,我有一个文件 test1.txt,其中包含“这是一个测试文件”。 我有一个目录/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);
}
}
最佳答案
有几个问题:
<小时/>您对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);
关于c - 尝试将文件复制到目录。但该文件会自行清除。 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065950/