2017-05-09 7 views
0

Je regarde à travers un programme de copie en c, j'essaie de comprendre comment fonctionne le code ci-dessous. J'ai des recherches sur les fonctions, mais pour une raison que je ne peux pas comprendre. par exemple. "./main a temp /" cette commande copie a dans le dossier temp, le code ci-dessous assigne le second argument en tant que répertoire s'il se termine par un "/" qui est temp /. si l'utilisateur entre "./main a b" alors le programme copie a et crée b avec les mêmes permissions que b. Je sais tout le reste. Sauf le code ci-dessous. Quelqu'un peut-il s'il vous plaît expliquer le code ci-dessous et comment cela fonctionne. Mercicopier le fichier en utilisant le 2ème argument comme répertoire

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

Le code ne garantit pas que la chaîne créée est terminée par un caractère nul; il devrait copier 'ilen + 1' octets avec le second' memcpy() 'pour s'assurer que l'octet nul à la fin de' iname' est copié. –

+0

1) le code * ne vérifie pas si le chemin se termine par a/et 2) que voulez-vous savoir à ce sujet? – immibis

+0

Je veux savoir comment le code fonctionne, vous avez raison, il ne vérifie pas mais si la commande est ./main un temp /, il prend le second argument en tant que répertoire car il comprend une barre oblique –

Répondre

0

Le but de cette fonction est de retourner un chemin de fichier. Le chemin du fichier de destination.

Vous avez identifié qu'il existe deux modes pour ce programme. 1) où les deux paramètres sont des noms de fichiers, et 2) où les seconds paramètres sont un dossier.

Mode 1) Les deux paramètres sont des noms de fichiers.

./main old.txt new.txt

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

Mode 2) Le second paramètre est un dossier.

./main old.txt my_archive/

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

post-scriptum Dans les deux modes, ce code renvoie le nom de fichier dans la nouvelle mémoire, qui doit être géré; Il ne dépend pas de la mémoire allouée de l'un ou l'autre des paramètres.

P.P.S Comme @Jonathan l'a souligné, la qualité du code autour de la mémoire et de la terminaison nulle n'est pas excellente.

+0

Avec votre entrée:' my_archive/old.txt '->' my_archive // ​​old.txt' – 4386427

+0

je comprends cela, mais je veux savoir comment il sait si le second argument a une barre oblique comme dans le nom de fichier /, alors c'est un répertoire, –

+0

@MehdiRahimi: c'est un travail de l'appel système 'stat()' et le test if (IS_DIR (ost.st_mode)) 'Voir également POSIX sur [Résolution de chemin] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04. html # tag_04_13): _ Un chemin contenant au moins un non ' 'caractère et qui se termine par un ou plusieurs caractères finaux' ' ne seront pas résolus avec succès à moins que le dernier composant de chemin précédant les caractères '' traîne nomme un répertoire existant ou une entrée de répertoire qui doit être créée pour un répertoire immédiatement après le chemin d'accès est résolu._ –