2014-04-23 93 views
0

檢測圖像文件上重複文件擴展名的最佳方法是什麼? (imageName.tif.jpg)。爲了保證JPG格式的文件擴展名,我必須使用自動追加.jpg到最後攝取。檢測重複文件擴展名

我想過迭代已知的文件擴展名並檢查文件名是否包含該擴展名。或者檢查期間和最後的第一個索引,但是如果圖像名稱出於任何原因是my.test.tif.jpg。最終,一旦我檢測到重複的擴展名,我想清除它的最後一個.jpg。

var fileName = Path.GetFileName(path); 

     if (fileName != null) 
     { 
      int firstFileExtPos = fileName.IndexOf(".", StringComparison.Ordinal); 
      int lastFileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal); 

      if (firstFileExtPos != lastFileExtPos) 
      { 
       path = path.Substring(0, path.Length - 4); 
      } 
     } 

     return path; 
+0

'path.Length - 4'請記住,並非所有圖像文件擴展名都是3個字符加一個點(4個字符)。有JPEG,TIFF,可能還有其他一些我記不住頭腦的東西。 – tnw

+0

假設該文件的擴展名爲「jpg」和「tif」('xyz.tif.jpg'),您將刪除哪個擴展名?在決定哪一個不適用之前,您是否需要確定真實的文件類型? – Icarus

+0

最後一個.jpg將被修剪。有些情況下甚至可能是.jpg.jpg。因爲修剪的長度爲4,所以總是將「.jpg」附加到最後。 – egordon21

回答

2

或許要做到這一點,首先做一個測試,如最簡單的方法:

ExtraExtension = Path.GetExtension(Path.GetFileNameWithoutExtension(fileName)) 

看看是否還有一個額外的擴展。

然後,您可以測試與已知的擴展名的列表,如果是的話,你只是刪除最後一個擴展:

fileName = Path.GetFileNameWithoutExtension(fileName) 
+0

謝謝,非常乾淨,簡單。我也喜歡Regex的答案,但不想維護/本地化所有有效的圖像擴展。 – egordon21

0

可以(只要你想使用|分離器添加儘可能多的擴展)使用正則表達式:

if (Regex.IsMatch(fileName, @"\.(tif|jpg|gif|bmp)\.jpg$")) 
    path = path.Substring(0, path.Length - 4); 
0

像這樣的事情是非常優雅(和通用):

static string PurgeRedundantExtensions(string fileName , params string[] extensions) 
{ 
    if (string.IsNullOrWhiteSpace(fileName)) throw new ArgumentNullException("fileName"    ) ; 
    if (extensions.Length < 1    ) throw new ArgumentException( "no extensions supplied") ; 

    List<segments> segments  = fileName.Split('.') ; 
    int   last   = segments.Length - 1 ; 
    bool   hasRedundancy = segments.Length > 2 
           && extensions.Contains(segments[ last ] , StringComparer.OrdinalIgnoreCase) 
           && extensions.Contains(segments[ last-1 ] , StringComparer.OrdinalIgnoreCase) 
           ; 

    if (hasRedundancy) 
    { 
    segments.RemoveAt(last) ; 
    } 

    string purged = string.Join("." , segments) ; 
} 

所以,你可以這樣說

string raw  = "foobar.gif.jpg" ; 
string cleaned = PurgeRedundantExtensions(raw , 
        "gif" , "jpg" , "jpeg" , "bmp" , "png" , "tiff" , "tif" 
        ) ; 

,並取回

foobar.gif 
+0

這也很好。我喜歡它忽略文件名中的潛在噪聲,如果通過僅評估段索引器上的最後兩次出現來存在時段。 – egordon21