目标:在给定文件名和目录的情况下,如果目录中存在同名文件,请在文件名后附加“随机”数字字符串并将其保存在目录中。不要假设文件名有扩展名。
示例:
somepic.jpg --> somepic19232139195.jpg
somepic --> somepic19232139195.jpg
尝试解决方案:
string suffix = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond).ToString();
int thisIndex = newFilePath.LastIndexOf('.');
newFilePath = newFilePath.Insert(thisIndex != -1 ? thisIndex : newFilePath.Length, suffix);
问题:对于没有扩展名的文件不起作用,我无法弄清楚原因。使用当前解决方案somepic
(无扩展名)变为somepic
。
其他问题:
在上面的代码中,C#是否应该使用整数类型而不是int
?是否有一个整数类型保证保持字符串的最大大小,相当于C ++中的size_t
?
答案 0 :(得分:2)
我认为可以更好地解决这个问题。
试试这个
string extensionFile = newFilePath.GetExtension();
newFilePath = Path.GetFileNameWithoutExtension(newFilePath);
newFilePath += suffix;
newFilePath += string.IsNullOrEmpty(extensionFile) ? String.Empty : extensionFile;
<强>更新强> 如果您的文件只有扩展名“.gitignore”
,则可以对Siada发表评论string extensionFile = newFilePath.GetExtension();
string fileName = Path.GetFileNameWithoutExtension(newFilePath);
if (!String.IsNullOrEmpty(fileName))
{
newFilePath += fileName + suffix;
newFilePath += string.IsNullOrEmpty(extensionFile) ? String.Empty : extensionFile)
}
else
{
newFilePath = extensionFile.Insert(1, suffix);
}
答案 1 :(得分:0)
警告:如果您(如您的示例中)有一个名为“somepic.jpg”和“somepic”的文件,您的代码可能会尝试将这些文件重命名为完全相同的名称,崩溃或覆盖。也就是说,您可以处理大量文件,直到后缀发生变化。
否则,假设所有文件都是“.jpg”:
,这样的事情应该有效namespace ConsoleApplication1
{
using System;
using System.Globalization;
using System.IO;
class Program
{
static void Main(string[] args)
{
RenameJpegFiles(@"c:\tmp");
}
private static void RenameJpegFiles(string path)
{
foreach (var filename in Directory.GetFiles(path))
{
string suffix = (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond).ToString(CultureInfo.InvariantCulture);
var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filename);
var newFilename = string.Format("{0}{1}.jpg", fileNameWithoutExtension, suffix);
var newFullFilename = Path.Combine(path, newFilename);
File.Move(filename, newFullFilename);
Console.WriteLine("Renaming: {0} -> {1}", filename, newFullFilename);
}
}
}
}
Renaming: c:\tmp\somepic.jpg -> c:\tmp\somepic63569994418865.jpg
Renaming: c:\tmp\some_other_pic -> c:\tmp\some_other_pic63569994418865.jpg
Press any key to continue . . .