【问题标题】:Copying executable file in c在c中复制可执行文件
【发布时间】:2017-03-11 22:21:36
【问题描述】:

我试图在我的 c 程序中复制一个可执行文件。请看下面的代码:

int dumpDaExecutable(char *progpath){

char *base, *basec;

basec = strdup(progpath);

base = basename(basec);

printf("%s\n", base);

//rename(progpath, base);

FILE *ptr_of, *ptr_nf;

int x;

ptr_of = fopen(basec, "rb");
ptr_nf = fopen(base, "wb");

if(ptr_of == NULL){
    printf("Old file is NULL\n");
    return 1;
}

if(ptr_nf == NULL){
    printf("New file is NULL\n");
    fclose(ptr_of);
    return 1;
}

unsigned char c[4096];

while(1){

    //printf("in the while!\n");

    x = fread(c, 1, 4096, ptr_of);

    if(x < 1){
        if(x == 0)
            printf("success");
        break;
    }
    if(fwrite(c, x, 1, ptr_nf) != 1){
        break;
    }

}

fclose(ptr_nf);
fclose(ptr_of);
//free(base);
//free(basec);
return 0;

}

我传递的 progpath 是 */program - 其中 * 是父文件夹,program 是实际的可执行文件。我的程序运行后,创建的新文件是空的。我很困惑为什么会这样。复制可执行文件时需要做一些不同的事情吗?

程序文件的权限设置为777。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 贴出的代码,为了安全起见,应该检查新文件和旧文件不是同一个文件。
  • 发布的代码应该在调用后立即检查对fopen() 的调用是否成功/失败,而不是稍后的一些指令,当fopen() 失败时,调用perror() 那样会还输出操作系统认为对fopen() 的调用失败的原因。
  • 请发布一个完整的、最小的、可验证的代码和您正在使用的实际命令行。
  • 贴出的代码名为strdup(),但未能将结果指针传递给`free(),因此存在内存泄漏。

标签: c file-io io


【解决方案1】:

你需要:

if(fwrite(c, 1, x, ptr_nf) != x){
    // display error
    break;
}

要复制文件,您可以:

while fread(..)
    fwrite(..);

#define你的缓冲区大小也是一个好习惯:

#define BUFF_SIZE 4096

// or use const int buffSize = 4096;

unsigned char c[BUFF_SIZE];

x = fread(c, 1, BUFF_SIZE, ptr_of);

【讨论】:

  • 我尝试了您建议的更改,但仍然得到一个空白文件。
  • 无符号字符 c[BUFF_SIZE]; while((x = fread(c, 1, BUFF_SIZE, ptr_of) != 0)){ if(fwrite(c, 1, x, ptr_nf) != x){ break; } }
  • 你能成功打开这两个文件吗?你有没有其他错误? (也许尝试在您的 while 循环中打印 x 的值或使用调试器)
  • 是的,我能够成功打开这两个文件而没有错误。如果我使用 fread,并在 while 循环中放置一条打印语句,则不会打印任何内容。它甚至没有将条件传递到 while 循环中。但是,如果我读了 = fgetc(ptr_of); while(ptr_of != EOF){ printf("%c", read);读取 = fgetc(ptr_of); } 循环永远不会结束,它只会打印出 unicode。
  • 然后您必须检查ferror() - 请参阅cplusplus.com/reference/cstdio/fread
猜你喜欢
  • 2018-05-29
  • 2022-11-27
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多