2008-11-14 7 views
4

Ce n'est pas mon code; J'essaie de comprendre ce que cela fait exactement. C'est une partie d'un grand système ancien écrit en C (en fait, il a été écrit il y a 4 ans, mais probablement écrit par une mentalité de programmeur de la fin des années 80). Partie du code:Est-ce que ce code supprime une extension de fichier?

char DestFile[256]; 
char DestFile2[256]; 

//This part is just to show an example 
strcpy(DestFile, "/foo/boo/goo.gz") 

strcpy (DestFile2, DestFile); 
Ptr = strrchr (DestFile2, '.'); 
if (Ptr != 0) { 
    if ((strcmp (Ptr, ".gz") == 0) || 
     (strcmp (Ptr, ".Z") == 0)) { 
     *Ptr = 0; 
     rename (DestFile, DestFile2); 
    } 
} 

DestFile2 n'est défini nulle part ailleurs dans la fonction. J'ai compilé le code ci-dessus, et en imprimant le DestFile montre que rien n'a changé. La seule chose que je peux penser que cela fait est de supprimer l'extension de fichier (* Ptr = 0) mais ma connaissance de C est très limitée ...

Des idées? Il semble que chaque fois qu'il obtient un fichier avec .gz ou .z, il renomme le fichier au même nom.

+0

Notez que la fonction rename() pourrait échouer, mais ce code ne serait pas le plus sage - tester si les fonctions qui peuvent échouer échouent, en particulier lorsque des fichiers sont impliqués. –

Répondre

17

Vous avez raison.

En C une chaîne est un tableau de caractères terminée par un caractère avec le code ASCII 0.

Alors, d'abord, destfile est copié DestFile2

Ensuite, une analyse de la droite est effectuée, de trouver l'occurrence la plus à droite de '.' Renvoie un pointeur vers le caractère correspondant ou null si aucune occurrence n'est trouvée.

Alors maintenant, vous avez (par exemple le nom: myfile.gz)

DestFile2

   |- Ptr 
       v  
    M y f i l e . g z \0 

Ensuite, il compare si la chaîne à partir de Ptr correspond .Z ou .gz et si oui , définit la valeur du caractère pointé par Ptr sur \ 0, tronquant effectivement la chaîne.

Après avoir réglé Ptr à \ 0 vous avez maintenant

M YFile \ 0 gz \ 0

Rappelez-vous que c pense qu'une chaîne se fait lorsque nous atteignons un \ 0, donc la dernière renommer efficacement dit

rename("myfile.gz", "myfile"); 
1

Oui, c'est ce que cela ressemble à moi aussi. Il est en train de renommer les fichiers .gz ou .Z (fichiers gzippés ou Unix compressés) pour supprimer l'extension. Pourquoi cela me bat-il? Le seul usage que j'ai vu pour faire de telles choses est de contourner les serveurs de courrier électronique fascistes qui ne permettent pas les pièces jointes compressées.

+1

Est-ce que ces serveurs de messagerie prônent vraiment un gouvernement «fort» avec de solides liens d'entreprise? – wnoise

+1

@wnoise - Eh bien, étant donné qu'ils sont généralement gérés par de grandes entreprises, et imposent des règles descendantes inflexibles sur la façon dont tout le monde peut utiliser leurs outils de messagerie ... –

0

Peut-être l'extension ".gz" devait être supprimée comme dans ".tar.gz" pour rendre l'extension simple, comme pour DOS ou quelque chose? En fait, je ne peux pas le dire en regardant. Puis à nouveau si l'extension composée était même disponible en premier lieu cela pourrait ne pas l'être.

Questions connexes