用C传输文件

时间:2010-06-24 10:41:11

标签: c file environment-variables

如何将文件从一个文件夹传输到另一个文件夹,其中两个文件夹都存在于oracle主目录中?

int main(int argc, char *argv[]){
    char *home, *tmp2;
    home = getenv("ORACLE_HOME");
    temp2 = getenv("ORACLE_HOME");
    strcat (home,"A");
    strcat (tmp2,"B");

//transfer files from home to tmp2

}

strcat似乎不起作用。在这里,我看到tmp2指针没有正确更新。

编辑:操作系统是基于UNIX的计算机。代码已编辑。 我需要一个二进制文件来执行此复制,目的是无法查看实际代码。因此我没有考虑使用shell脚本作为选项。 A中的文件已加密,然后复制到B,在B中解密并运行。由于文件是在perl中,我打算使用系统命令在相同的C代码中运行它们。

4 个答案:

答案 0 :(得分:1)

首先如前所述,你的这种“安全”完全没用。拦截正在复制的文件(有很多工具来监视文件系统的变化等)是微不足道的,但这是另一回事。

第一部分就是你如何做到的。要进行实际复制,你必须使用system()或读取整个文件,然后再次写入,这对于这种快速复制来说有点长。

int main(int argc, char *argv[]){
  char *home, *tmp2;
  home = strdup(getenv("ORACLE_HOME"));
  tmp2 = strdup(getenv("ORACLE_HOME"));
  home = realloc(home, strlen(home)+strlen("A")+1);
  tmp2 = realloc(tmp2, strlen(tmp2)+strlen("B")+1);
  strcat (home,"A");
  strcat (tmp2,"B");
}

顺便说一下,如果你只是移动文件就可以了,那就更容易了,你可以这样做:

rename(home,tmp2);

答案 1 :(得分:1)

使用system(3)命令可能是一个好主意,因为您可以方便地使用shell解释器扩展文件名(通过*),但避免了计算打印所需缓冲区的确切长度的麻烦该命令使用固定长度的缓冲区并确保它不会溢出:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFSZ 0xFFF
int main(void)
{
    char * ohome = getenv("ORACLE_HOME"), cmd[BUFSZ];
    char * fmt="/bin/mv %s/%s/* %s/%s";
    int written = snprintf(cmd, BUFSZ, fmt, ohome, "A", ohome, "B"), ret;
    if ((written < 0) || (written >= (BUFSZ-1))) {
      /* ERROR: print error or ORACLE_HOME env var too long for BUFSZ. */
    }
    if ((ret = system(cmd)) == 0) {
      /* OK, move succeeded. */
    }
    return 0;
}

正如评论者Paul Kuliniewicz指出的那样,如果您的ORACLE_HOME包含空格或其他特殊字符,可能会由“system”命令中的子shell解释,从而产生意外结果。使用execlexecv系列中的一个将允许您构建参数,而不必担心shell解释器执行它自己的解释,但代价是使用通配符。

答案 2 :(得分:0)

没有考虑到您的要求,而是对您的代码发表评论:

您可能无法strcat getenv的结果,因为getenv可能(在某些环境中)返回指向只读内存的指针。相反,创建一个新的缓冲区并将{gentv的结果strcpy放入其中,然后strcat文件名的其余部分。

答案 3 :(得分:0)

执行传输的快速方法是使用cp shell命令进行复制,但使用system命令而不是使用shell脚本来调用它。

或者,让您的C程序创建一个shell脚本来进行复制,运行shell脚本,然后将其删除。