检测重复的文件扩展名

本文关键字:文件 扩展名 检测 | 更新日期: 2023-09-27 17:59:31

检测图像文件上重复文件扩展名的最佳方法是什么?(imageName.tif.jpg)。为了确保jpg的文件扩展名,我必须在摄取时使用autoappends.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;

检测重复的文件扩展名

也许最简单的方法是先做一个测试,比如:

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

看看是否还有额外的扩展。

然后,您可以根据已知扩展列表进行测试,如果是这样,您只需删除最后一个扩展:

fileName = Path.GetFileNameWithoutExtension(fileName)

您可以使用regex(使用|分隔符添加任意数量的扩展):

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

像这样的东西非常优雅(也是通用的):

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