2010-06-24 113 views
0

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

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中,我打算使用system命令在相同的C代码中运行它们。

+0

你可以把代码放好吗?当我们甚至无法看到足迹时,很难看到它。顺便说一句,你逃避\ \字符就像\\ – 2010-06-24 10:43:24

+0

它看起来像一次性任务。那么你应该使用shell脚本,而不是C. – 2010-06-24 10:43:54

+0

为什么** strcat **注释?直到那时,我想我明白了。但那让我失望了,现在我不知道你的问题意味着什么。 – MJB 2010-06-24 10:45:09

回答

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解释器会自行解释,但是会牺牲使用通配符。

+0

如果$ ORACLE_HOME包含空格或任何特殊字符,那么这段代码会做出令人惊讶的事情。使用fork和execlp完全跳过shell并确保参数列表按您想要的方式进行解析更安全。 – 2010-06-26 03:31:32

+0

@Paul:true,我首先考虑了这个选项,但是在子shell中使用通配符以便在源目录中对所有文件名进行整合的便利对我来说似乎是一个巨大的胜利;也分别构建参数值,然后争论更加乏味,而不是OP的示范。 – maerics 2010-06-26 03:35:14

0

不realted到你的要求,但在你的代码中的注释:

你可能无法strcatgetenv的结果,因为GETENV可能(在某些环境中)返回一个指针到只读内存。取而代之的是,将一个新的缓冲区和getenv的结果写入它,然后strcat其余的文件名。

+1

无论它是否是只读的,它都会写入其他人的内存,并可能导致缓冲区溢出。 – 2010-06-25 23:04:23

0

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

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

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);