我有一个方法可以将选定的图像从OpenFileDialog
复制到定义的位置,我想检查是否存在具有相同名称的图像,如果存在,则可以动态更改名称。
这是我的方法:
public void SaveImage(IList<AppConfig> AppConfigs, string ImageNameFilter)
{
string imgPath = AppConfigs[0].ConfigValue.ToString();
Int32 i = 0;
StringBuilder sb = new StringBuilder(selectedFileName);
while (File.Exists(imgPath + "\\" + ImageNameFilter + selectedFileName))
{
sb.Insert(i, 0);
i++;
//ImageNameFilter += (i++).ToString();
}
File.Copy(selectedFile, imgPath + "\\" + ImageNameFilter + selectedFileName);
}
ImageNameFilter
是一个自定义过滤器,添加在每个图像的开头,用户需要此前缀才能识别图像的用途,只能通过查看前缀。 selectedFileName
是使用SafeFileName
拍摄的图片的名称,这意味着它看起来像这样 - imageName.jpeg
。
我对此代码有几个问题。首先,我想更改名称 - imageName1.jpeg, imageName2.jpeg, imageName3.jpeg...imageName14.jpeg..
,但如果我将selectedFileName
与+=
一起使用,则会添加所有内容,即使在.jpeg
之后,不是我想要的。我能想到的唯一解决方案是使用regex
,但我真的想找到另一种方法。
此外,递增i++
并将其与+=
相加会导致不需要的结果,即:
imageName1.jpeg, imageName12.jpeg, imageName123.jpeg...imageName1234567.jpeg
。
那么,我怎样才能得到我想要的结果,我在这里看到的妥协就是在_
之后添加下划线ImageNameFilter
,然后在{{的开头添加i
1}}而不是默认情况下的结尾。但是在字符串的开头添加一些内容也是我不知道该怎么做的事情。正如您所看到的,我尝试了selectedFileName
+ StringBuiledr
,但我没有得到预期的结果。
答案 0 :(得分:3)
基本上,您需要在开始循环之前将基本文件名与扩展名分开(使用Path
上的有用方法来执行此操作),然后继续生成文件名。每个候选人不将根据最后一个候选者生成(它仅基于固定信息和当前迭代次数),因此您根本不需要涉及StringBuilder
。< / p>
这是一个巧妙的方法,分两步完成。首先,设置簿记:
var canonicalFileName = ImageNameFilter + selectedFileName;
var baseFileName = Path.GetFileNameWithoutExtension(canonicalFileName);
var extension = Path.GetExtension(canonicalFileName);
然后执行循环 - 这里我使用LINQ而不是循环语句,因为我可以,但与库存while
循环没有本质区别:
var targetFileName = Enumerable.Range(1, int.MaxValue - 1)
.Select(i => Path.Combine(imgPath, baseFileName + i + extension))
.First(file => !File.Exists(file));
File.Copy(selectedFile, targetFileName);
答案 1 :(得分:1)
使用Path.GetFileNameWithoutExtension
或String.TrimEnd('.')
获取没有扩展名的FileName。您也可以使用FileInfo
来获取扩展程序。