2017-05-09 61 views
0

我正在通过复制程序在c,我想了解下面的代码如何工作。我有关于功能的研究,但由于某种原因,我无法理解它。例如“./main a temp /”这个命令复制一个文件夹temp,下面的代码将第二个参数赋值为一个目录,如果以“/”结尾为temp /。如果用户输入“./main a b”,则程序将复制一个并创建与b具有相同文件权限的b。我知道一切。除了下面的代码。有人可以解释下面的代码以及它的工作原理。 感谢复制使用第二个参数作为目录的文件

if(S_ISDIR(ost.st_mode)){  //if output filename is a directory 

    //concatenate directory name and input name 
    int ilen = strlen(iname); 
    int olen = strlen(oname); 

    int len = ilen + olen + 2; 
    char *copy_name = (char*) malloc(len); //dynamically allocate a memory buffer 
    if(copy_name == NULL) 
     oops("Cannot malloc memory", ":"); 

    memcpy(copy_name, oname, olen);   //copy directory name 
    copy_name[olen] = '/';     //separate directory and file name with a slash 
    memcpy(&copy_name[olen+1], iname, ilen); //copy output file name 
    return copy_name; 
}else{ 
    return strdup(oname); //if output filename is not a directory, just copy it 
} 
+1

该代码不确保创建的字符串是空终止的;它应该将'ilen + 1'字节与第二个'memcpy()'复制,以确保'iname'结尾处的空字节被复制。 –

+0

1)代码*不会*检查路径是以/结束的,2)您想知道关于它的具体内容? – immibis

+0

我想知道代码是如何工作的,你是对的,它不检查,但如果命令是./main temp /,它假定第二个参数为目录,因为它包含一个斜线 –

回答

0

该功能的目的是返回一个文件路径。目标文件路径。

您已经确定该程序有两种模式。 1)两个参数都是文件名,2)第二个参数是文件夹。

模式1)两个参数都是文件名。

./main old.txt new.txt

destinationFilePath = thisFunc("old.txt", "new.txt"); 
//new.txt 

模式2)第二个参数是一个文件夹。

./main old.txt my_archive/

destinationFilePath = thisFunc("old.txt", "my_archive/"); 
//my_archive/old.txt 

P.S.在这两种模式下,这段代码都会在新内存中返回文件名,这应该被管理;它不依赖任何一个参数的分配内存。

P.P.S像@Jonathan所指出的那样,内存和空终止的代码质量并不好。

+0

输入:'my_archive/old.txt ' - >'my_archive // old.txt' – 4386427

+0

我明白,但是我想知道它是如何知道第二个参数是否在文件名/中有一个斜杠,那么它是一个目录, –

+0

@MehdiRahimi:这是一个'stat()'系统调用和'if(IS_DIR(ost.st_mode))'测试。另请参阅[路径名解析]上的POSIX(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04。 html#tag_04_13):_至少包含一个非'的路径名'字符并且以一个或多个结尾''结尾的字符不能被成功解析,除非在结尾的''字符之前的最后一个路径名组件命名了一个现存的目录或者要立即为目录创建的目录条目路径名已解析。_ –

相关问题