此代码是否删除了文件扩展名?

时间:2008-11-14 15:47:14

标签: c++ c

这不是我的代码;我试图找出这究竟是什么。这是用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 个答案:

答案 0 :(得分:18)

你是对的。

在C中,字符串是由ASCII码为0的字符终止的字符数组。

首先,DestFile被复制到DestFile2

然后执行右扫描,找到最右边的'。'。 这将返回指向匹配的char的指针,如果未找到匹配则返回null。

所以现在你有(例子名:myfile.gz)

DestFile2

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

然后它比较从Ptr开始的字符串是否与.Z或.gz匹配,如果是,则将Ptr指向的char的值设置为\ 0,从而有效地截断字符串。

将Ptr设置为\ 0后,您现在有了

  

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

请记住,当我们达到\ 0时,c认为字符串已完成,因此最后一次重命名有效地说

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

答案 1 :(得分:1)

是的,这也是我的样子。它重命名任何.gz或.Z(gzip压缩文件或Unix压缩文件)以删除扩展名。

为什么它会这样做打败了我。我见过这样做的唯一用途是绕过不允许压缩附件的法西斯电子邮件服务器。

答案 2 :(得分:0)

也许“.gz”扩展名被删除,如“.tar.gz”一样,以使扩展简单,就像DOS或其他东西一样?其实我看不出来。然后再次,如果化合物扩展甚至可能在第一个可能不是它。