Этот код удаляет расширение файла? - PullRequest
4 голосов
/ 14 ноября 2008

Это не мой код; Я пытаюсь понять, что именно это делает. Это часть большой, древней системы, написанной на 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, он переименовывает файл с тем же именем.

Ответы [ 3 ]

18 голосов
/ 14 ноября 2008

Вы правы.

В C строка - это массив символов, оканчивающийся символом с кодом ASCII 0.

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

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

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

DestFile2

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

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

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

M y f i l e \ 0 g z \ 0

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

rename("myfile.gz", "myfile");
1 голос
/ 14 ноября 2008

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

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

0 голосов
/ 14 ноября 2008

Может быть, расширение ".gz" нужно было удалить, как в ".tar.gz", чтобы сделать расширение простым, например, для DOS или что-то еще? На самом деле я не могу сказать, глядя. С другой стороны, если составное расширение вообще было доступно, это может быть не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...