如何在可选扩展名之前将随机字符串附加到文件名?

时间:2015-06-15 17:29:46

标签: c# string algorithm

目标:在给定文件名和目录的情况下,如果目录中存在同名文件,请在文件名后附加“随机”数字字符串并将其保存在目录中。不要假设文件名有扩展名。

示例:

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

2 个答案:

答案 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 . . .