C# - 自定义图像名称转换为字符串

时间:2013-02-27 14:24:57

标签: c# string stringbuilder

我有一个方法可以将选定的图像从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,但我没有得到预期的结果。

2 个答案:

答案 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.GetFileNameWithoutExtensionString.TrimEnd('.')获取没有扩展名的FileName。您也可以使用FileInfo来获取扩展程序。