c - 尝试将文件复制到目录。但该文件会自行清除。 (C)

标签 c file-io

例如,我有一个文件 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/

相关文章:

c - 程序在 GDB 中的行为不同?

c - 双重释放错误释放二维数组

c - 是什么导致这个内存位置在某些情况下被破坏,而在其他情况下却没有?

database - 如何将视频存储在 PostgreSQL 数据库中?

vb.net - 该进程无法访问该文件,因为它正被另一个进程使用

c - postgres 连接池库

c - 星星金字塔

c - Lua C API - 将属性映射到函数

C 指定字节长度的读写问题

c++ - 用另一个文件替换一个文件,但保持文件同名。