从列表中删除文件后,自动重命名文件名无法正常工作

时间:2015-01-28 12:58:51

标签: c# .net file-rename

我在数据库中保存文件名。在保存之前,我正在检查数据库中是否存在文件名。如果是,我想在文件名之后附加一个唯一的ID,例如(1)或(2),等等在文件名之后。

一切正常,但是当我从检索到的列表和数据库中删除文件时,有时会获得重复的文件名。我的代码是:

var count = dbitems().Count(x.Name == name || x.Name.Contains(name + "("));         
if (count > 0)
{
    name = name + string.Format("({0})", count);
}

假设我保存了4个名称为

的文件
(1) File   
(2) File(1)    
(3) File(2)    
(4) File(3)    

从这个列表中我删除了文件(2)。当我尝试保存名为“File”的文件时,我的输出是File(3),但这已经存在。所需的输出应为“文件(2)”(删除(2)并且可以分配此名称)或“文件(4)”。我尝试过count + 1,但这也造成了问题。

简单来说,我希望像Windows资源管理器这样的行为创建一个自动指定唯一后缀的新名称。

3 个答案:

答案 0 :(得分:1)

你必须循环:

string origName = name;
int version = 0;
while(dbitems().Count(x.Name == name) > 0)         
{
    name = origName  + string.Format("({0})", ++version);
}

这会尝试名称,名称(1),名称(2),......直到找到一个空闲的“插槽”。它也适用于

姓名,姓名(1),姓名(5),姓名(6)

已经存在

答案 1 :(得分:0)

谢谢大家的帮助。我感谢你们所有人。以下是我实施的解决方案。

      public string UniqueName(string name, int parentId)
        {
           var files = allFiles.Where(x => x.ParentId == parentId).ToList();               

            var newName = name;
            if (files.Count() > 0)
            {
                for (var i = 1; i <= matches; i++)
                {
                    if (files.Any(x => x.Name == newName 
                        newName = string.Format("{0}({1})", name, i);

                    else
                        return newName 

                }

            }

            return newName 
    }

答案 2 :(得分:-1)

您需要检查每个候选人姓名,所以可能更像是:

int count = 0;
string baseName = name;
while (dbitems().Any(x.Name == name))
{
    count++;
    name = string.Format("{1} ({0})", count, baseName);
}