2014-04-23 96 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