2008-11-14 65 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

然後,執行從右側掃描一個字符終止字符數組,以找到最右邊的'。'出現。 這將返回指向匹配的char的指針,如果未找到匹配項,則返回null。

所以,現在你有(例如名稱:myfile.gz)

DestFile2

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

然後進行比較,如果開始PTR字符串匹配.Z或加上.gz如果是這樣,將Ptr指向的字符的值設置爲\ 0,從而有效地截斷字符串。

ptr設置爲\ 0後,您現在有

中號yfile \ 0 GZ \ 0

記住是c認爲,當我們到達一個\ 0串完成,所以最後有效地重命名說

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

是的,這就是它對我來說。它將重命名任何.gz或.Z(gzipped或Unix壓縮文件)以刪除擴展名。

爲什麼它會想要做到這一點擊敗我。我見過的做這種事情的唯一用途是繞過不允許壓縮附件通過的法西斯郵件服務器。

+1

這些電子郵件服務器真的提倡一個有強大企業聯繫的「強人」政府嗎? – wnoise 2011-01-27 22:54:50

0

也許「.gz」擴展名將被刪除,如「.tar.gz」,以使擴展名簡單,如DOS或其他?其實我看不出來。然後再一次,如果複合擴展程序甚至可能在第一個可能不是它可用。