2008-11-14 2 views
4

Это не мой код; Я пытаюсь выяснить, что именно это делает. Это часть большой, древней системы, написанной на C (фактически она была написана 4 года назад, но, скорее всего, написана менталитетом конца 80-х годов). Часть кода:Удаляет ли этот код расширение файла?

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 не установлен нигде в функции. Я скомпилировал вышеприведенный код, и распечатка DestFile показывает, что ничего не изменилось. Единственное, что я могу придумать, это удаление расширения файла (* Ptr = 0), но мои знания C очень ограничены ...

Любые идеи? Кажется, каждый раз, когда он получает файл с .gz или .z, он переименовывает файл в одно и то же имя.

+0

Обратите внимание, что функция rename() может выйти из строя, но этот код не будет более мудрее - проверьте, не сработают ли функции, которые могут выйти из строя, особенно когда файлы задействованы. – 2008-11-15 17:00:25

ответ

17

Вы верны.

В C строка представляет собой массив символов оканчивающихся символа с ASCII кодом 0.

Итак, первое, DestFile копируется в DestFile2

Затем сканирование с правой стороны выполняется, чтобы найти самое правое появление '.' Возвращает указатель на символ, который соответствует, или null, если обнаружение не найдено.

Так что теперь у вас есть (например, имя: myfile.gz)

DestFile2

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

Затем он сравнивает, если строка, начиная с Ptr соответствует .Z или .gz и если да, , устанавливает значение char, которое Ptr указывает на \ 0, эффективно обрезая строку.

После установки Указатель на \ 0 теперь у вас есть

M yfile \ 0 GZ \ 0

Помните, что с думает строка выполняется, когда мы достигаем \ 0, так что последний переименовать эффективно говорит

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

Да, это то, что мне кажется. Он переименовывает любые .gz или .Z (сжатые файлы gzipped или Unix), чтобы удалить расширение.

Почему он хотел бы, чтобы это меня било. Единственное, что я видел для таких вещей, - это обойти фашистские серверы электронной почты, которые не позволяют передавать сжатые вложения.

+1

Действительно ли эти серверы электронной почты выступают за «сильное человеческое» правительство с сильными корпоративными связями? – wnoise 2011-01-27 22:54:50

0

Возможно, расширение «.gz» должно быть удалено, как в «.tar.gz», чтобы сделать расширение простым, например, для DOS или что-то еще? На самом деле я не могу сказать, глядя. Опять же, если составное расширение было даже доступно, в первую очередь, это может быть и не так.

Смежные вопросы