0

我有一种方法可以将选定的图像从一个复制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

那么,我怎样才能得到我想要的结果,我在这里看到的折衷方案是_在 theImageNameFilter之后添加下划线,然后iselectedFileName默认情况下在而不是末尾添加下划线。但是在字符串的开头添加一些东西也是我不知道该怎么做的事情。如您所见,我尝试了StringBuiledr+ Insert,但没有得到预期的结果。

4

2 回答 2

3

基本上,您需要Path在开始循环之前将基本文件名与扩展名分开(使用有用的方法来执行此操作),然后继续生成文件名。每个候选者都不会根据最后一个生成(它只是基于固定信息和当前迭代次数),因此您根本不需要涉及 a StringBuilder

这是分两步完成的一种巧妙方法。首先,设置簿记:

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);
于 2013-02-27T14:35:07.780 回答
1

使用Path.GetFileNameWithoutExtensionString.TrimEnd('.')获取不带扩展名的文件名。您也可以使用FileInfo来获取扩展名。

于 2013-02-27T14:34:30.657 回答