2014-04-25 132 views
0

全部。我正在嘗試編寫一個C++程序,它將遍歷用戶指定的目錄(例如/ home/alpernick/Pictures)。首先,這是爲了確保沒有重複(通過md5sum進行檢查)。確保文件擴展名匹配C++中的文件類型

但我真正想要包括的一個功能是確保文件名的擴展名與文件的類型匹配。

例如,如果文件的名稱是「sunrise.png」,我想確保它確實是一個PNG,而不是錯誤標記的JPEG(例如)。

我用四個函數來解決這個問題,如下所示。

  • 字符串的擴展名(字符串文件名)//返回文件名的擴展名(包括名爲.tar.gz處理,所以它不是一味地只是返回最後3個字符)

  • 串的fileType(串fileName)//這個是鍵 - 它返回實際的文件類型,所以如果名爲fileName的文件是PNG,fileType()將返回PNG,而不管返回值是否爲擴展名()

  • string基本名稱(字符串文件名)//重新生成文件的基本名稱,即(所以,對於sunset.jpg,它會返回日落;對於蓬鬆球,tar.gz,它會返回蓬鬆球)

  • string renameFile(string incorrectFileName,string fileNameBeforeExtension,string actualFileType)//返回字符串,其值是與正確的文件擴展名連接的基本名稱。

string file = sunset.jpg; 
/* Setting file to be hard-coded for illustrative purposes only */ 
if(extension(file) != fileType(file) 
{ 
    char fixedName [] = renameFile(file, basename(file), fileType(file)); 
    puts(fixedName); 
} 

我與字符串處理爲零的問題。然而,我卡在fileType()上。我希望這個程序不僅能在我的主機(Kubuntu 14.04)上運行,而且還能夠在Windows機器上運行。所以,看起來我需要一些庫或一組庫,這對兩者都是通用的(或者至少爲兩者編譯)。

任何幫助/建議?

+0

您需要知道要檢查的內容的文件格式,並知道該內容的某些類型指示符(例如某些文件類型的幻數)。我懷疑,有這樣的可用於任意類型的文件。 –

回答

2

根據文件的內容猜測文件的實際類型有比規則更多的例外。

由於文件可以被認爲是有效和有用的解釋爲兩種完全不同的文件類型,這加劇了這一點。

對於試圖猜測數據不足的好程序,請嘗試在Unixoids上使用file

1

你可以試試看file源代碼:https://github.com/file/file

但維基百科指出

文件的位置敏感的測試通常由對幻數的文本數據庫文件中匹配的不同位置來實現(參見使用部分)。這不同於其他更簡單的方法,例如文件擴展名和MIME等方案。

在大多數實現中,文件命令使用數據庫來驅動探測前導字節。該數據庫在一個名爲magic的文件中實現,其位置通常位於/ etc/magic,/ usr/share/file/magic或類似位置。

所以這似乎並不重要。

+0

我意外模糊(儘管具體):我只對PNG,JPG,GIF感興趣 - 該程序的目的是檢查圖像文件目錄中的重複項(非圖像類型文件(文本文件,檔案等) ,所以我正在尋找的只是圖像文件,以確保擴展名爲.png的文件實際上是一個PNG文件。 我想在C++中這樣做,就像我曾經如上所述,在標題中,所以我需要一些C++庫,而不是像'file'這樣的shell工具。 – alpernick

相關問題