2015-06-15 3 views
0

Цель: Если вы указали имя файла и каталог, если в каталоге есть файл с тем же именем, добавьте имя файла в «случайную» строку цифр и сохраните его в каталоге. Не предполагайте, что имя файла имеет расширение.Как добавить случайную строку к имени файла перед дополнительным расширением?

Пример:

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 в приведенном выше коде? Имеет ли он интегральный тип, гарантированный максимальный размер строки, эквивалент size_t в C++?

+3

Посмотрите на [Путь :: GetFileNameWithoutExtension] (https://msdn.microsoft. com/en-us/library/system.io.path.getfilenamewithoutextension (v = vs.110) .aspx) вместо того, чтобы пытаться его проанализировать. – crashmstr

+0

Знаете, если у вас (как в вашем примере) файл с именем «somepic.jpg» и «somepic», ваш код, вероятно, попытается переименовать эти файлы на одно и то же имя, сбой или перезапись. То есть вы можете обрабатывать множество файлов, пока ваш суффикс не изменится. – Micke

+0

[Ваш код работает нормально] (http://ideone.com/hj4iK0). – Dukeling

ответ

3

Я думаю, что эту проблему можно решить лучше.

Попробуйте с этим

string extensionFile = newFilePath.GetExtension(); 
newFilePath = Path.GetFileNameWithoutExtension(newFilePath); 
newFilePath += suffix; 
newFilePath += string.IsNullOrEmpty(extensionFile) ? String.Empty : extensionFile; 

Обновлено: Workaraound на Siada комментарий, если у вас есть только файлы с расширением, как ".gitignore"

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); 
} 
+0

Проблема с этим решением заключается в том, что если ваш файл является, например, «.gitignore», это приводит к разрыву файла, потому что он просто возьмет .gitignore как расширение и добавит ваш суффикс к началу, а не к концу. таким образом, заканчивается '19232139195.gitignore' – Siada

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 . . . 
Смежные вопросы