我有一个fileupload
控件,我想要实现的是将nuber连接到它,以使其独一无二。
我发现的所有帖子都在谈论添加GUID
或DateTime
我想要实现的是如果文件存在于文件夹中,那么文件名将是文件名+(计数器)
示例:
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;
}
}
我怎样才能做到这一点?
答案 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)";
}
}