2017-05-09 6 views
0

私はcでコピープログラムを見ていますが、私は以下のコードの仕組みを理解しようとしています。私は機能についての研究を持っていますが、何らかの理由でそれについて私の頭を上げることはできません。例えば"./main a temp /"このコマンドはaをtempにコピーします。下のコードは、temp /である "/"で終わる場合、2番目の引数をディレクトリとして割り当てます。ユーザーが "./main a b"と入力すると、プログラムはaをコピーし、bと同じファイル権限でbを作成します。私は他のすべてを知っている。以下のコードを除きます。誰かが下のコードとその動作を説明してくれますか? ありがとう2番目の引数をディレクトリとして使用するコピーファイル

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

コードでは、作成された文字列がnullで終了することを保証しません。 'ilen + 1'バイトを' memcpy() 'と一緒にコピーして、' iname'の終わりのヌルバイトがコピーされるようにする必要があります。 –

+0

1)コードはパスが/で終わるかどうかチェックしません。2)正確に知りたいことは何ですか? – immibis

+0

コードがどのように動作しているか知りたいのですが、それはチェックされませんが、コマンドが./main a temp /の場合、スラッシュが含まれているため、ディレクトリとして2番目の引数が仮定されます。 –

答えて

0

この関数の目的は、ファイルパスを返すことです。宛先ファイルのパス。

このプログラムには2つのモードがあることがわかりました。 1)両方のパラメータがファイル名である場合、2)第2パラメータがフォルダの場合。

モード1)両方のパラメータはファイル名です。

./main old.txt new.txt

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

モード2)は、第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

2番目の引数にファイル名/のようにスラッシュがあるかどうか知りたいのですが、それはディレクトリです。 –

+0

@MehdiRahimi:それは'stat()'システムコールと 'if(IS_DIR(ost.st_mode))'テストも参照してください(POSIXの[パス名解決](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04)も参照してください。 html#tag_04_13):_A少なくとも1つの非 '末尾の ''文字の末尾にある最後のパス名の構成要素が、既存のディレクトリまたは直後のディレクトリに対して作成されるディレクトリエントリを指定しない限り、正常に解決されませんパス名が解決されます。_ –

関連する問題