检测图像文件上的重复文件扩展名的最佳方法是什么? (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 :(得分:2)
也许最简单的方法是先做一个测试:
ExtraExtension = Path.GetExtension(Path.GetFileNameWithoutExtension(fileName))
查看是否有额外的延期。
然后,您可以针对已知扩展名列表进行测试,如果是,则只删除最后一个扩展名:
fileName = Path.GetFileNameWithoutExtension(fileName)
答案 1 :(得分:0)
您可以使用正则表达式(使用|
分隔符添加任意数量的扩展程序):
if (Regex.IsMatch(fileName, @"\.(tif|jpg|gif|bmp)\.jpg$"))
path = path.Substring(0, path.Length - 4);
答案 2 :(得分: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