FileUpload如果存在concat(counter)名称

时间:2017-07-30 14:41:05

标签: c# asp.net file-upload

我有一个fileupload控件,我想要实现的是将nuber连接到它,以使其独一无二。

我发现的所有帖子都在谈论添加GUIDDateTime

我想要实现的是如果文件存在于文件夹中,那么文件名将是文件名+(计数器)

示例:

  • 该文件夹包含文件名 - file.png

1)当我再次上传相同的文件名时,现有的文件名将不会被删除,而新的名称将被称为file(1).png

2)当我再次上传相同的文件名时,(file.png) 现在新文件将被称为file(2)

我有这个代码来处理第一个案例而不是第二个案例:

public static string GetUniqueName(string fileName)
{
        string dir = Globals.Directories.GetCustomCategoryThumbnailDir();
        string fileExtension = Path.GetExtension(fileName);
        string fileNameWE = Path.GetFileNameWithoutExtension(fileName);
        string[] files = Directory.GetFiles(dir, "*" + fileExtension)
                                .Select(Path.GetFileName)
                                .ToArray();
        string uniqueName = fileNameWE;
        int nextNum = 0;
        bool fileExist = false;
        string pattern = @"(.*)\(([\d]+)\)";

        foreach (var file in files)
        {
            var tempFileName = Path.GetFileNameWithoutExtension(file);
            var match = Regex.Match(tempFileName, pattern);

            if (tempFileName.Equals(fileNameWE))
            {
                // file exist in folder
                fileExist = true;
            }
            if (tempFileName.StartsWith(fileNameWE) && match.Success)
            {
                // there is a file name that start with "fileToUpload" name, we want to to take the number
                nextNum = Convert.ToInt32(match.Groups[2].Value);
                nextNum++;
            }
        }

        if (nextNum == 0 && !fileExist)
        {
            // filename dont exist                
            return fileNameWE + fileExtension;
        }
        if (nextNum == 0 && fileExist) 
        {
            // the file name exist without (1)
            fileNameWE = $"{fileNameWE}(1)";
            return fileNameWE + fileExtension;
        }
        else
        {
            var haveParentessis = Regex.Match(fileNameWE, pattern);

            if (haveParentessis.Success)
            {
                // we need to reset the nextNum
                nextNum = 1; 
            }

            // return the new unique name with suffix
            fileNameWE = string.Format("{0}({1})", fileNameWE, nextNum);
            return fileNameWE + fileExtension;
        }
    }

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

是的,这是因为下面指出的while循环是函数的本地循环,因此counter变量也是一个局部变量将不会保持它的当前值。所以实质上每个请求都会得到一个新的页面实例,因此你的counter将被重新初始化为0

 while (File.Exists(Path.Combine(dir, fileNameWE + fileExtension)))
 {
      fileNameWE = fileNameWE + "(" + counter.ToString() + ")";
      counter++;
 }

要完成此操作,您应将counter变量存储在Session中并将其恢复。不要忘记它是一个Web应用程序,因此除非您明确地执行该操作,否则不会维护状态

 if (File.Exists(Path.Combine(dir, fileNameWE + fileExtension)))
 {
      counter = (Session["counter"] != null) ? ((int)Session["counter"])++ : default(int);
      fileNameWE = fileNameWE + "(" + counter.ToString() + ")";
      Session["counter"] = counter;
 }

答案 1 :(得分:0)

我在下面使用正则表达式来实现这一点。不需要持久性计数器。我认为concat问题是因为没有做任何事情来处理现有的(1)后缀。我编写了这个潜在的解决方案并希望它有所帮注意:只在调试器中轻微测试,我是新手

{
    string fileName = @"C:\Uploads\Testfile.bin";
    string fileExtension = Path.GetExtension(fileName);
    string fileNameWE = Path.GetFileNameWithoutExtension(fileName);
    string pattern = @"(.*)\(([\d]+)\)$";

    var match = Regex.Match(fileNameWE, pattern);
    if (match.Success)
    {
        int nextNum = Convert.ToInt32(match.Groups[2].Value);
        nextNum++;
        fileNameWE = $"{match.Groups[1].Value}({nextNum})";
    }
    else
    {
        fileNameWE = $"{fileNameWE}(1)";
    }
}