C # - добавить номер в файл, который будет сохранен - PullRequest
7 голосов
/ 08 октября 2009

Я создал программу для скриншотов, и все работает отлично. Единственная проблема в том, что я не уверен, как мне сделать так, чтобы скриншоты сохранялись с добавлением номеров.

Пример: Снимок экрана 1, Снимок экрана 2, Снимок экрана 3, Снимок экрана 4 и т. Д.

Очевидно, это может быть применено к другим сохраняемым файлам. Есть идеи? Спасибо.

Ответы [ 6 ]

11 голосов
/ 08 октября 2009

Вот метод, который я часто использую для этого случая. Просто передайте строку типа «Снимок экрана», и он найдет самое низкое доступное имя файла в формате «Снимок экрана [число]» (или просто «Снимок экрана», если его еще нет):

private string GetUniqueName(string name, string folderPath)
{
    string validatedName = name;
    int tries = 1;
    while (File.Exists(folderPath + validatedName))
    {
        validatedName = string.Format("{0} [{1}]", name, tries++);
    }
    return validatedName;
}

(Примечание: это несколько упрощенная версия, не учитывающая расширения файлов).

3 голосов
/ 08 октября 2009

Есть ли причина, по которой вы используете цифры? Будет ли эта же папка позже использоваться для другой сессии? Должны ли номера перезапускать и заменять существующие файлы, если день другой?

Об этом нужно помнить. Стоит отметить, что OS X раньше предоставляла «Рисунок 1», «Рисунок 2» при создании снимков экрана, и, к счастью, в новой версии теперь используется «Снимок экрана, сделанный 2009-12-08 в 11.35.12» или что-то подобное, позволяющее упрощение сортировки по дате, исключение конфликтов имен и т. д.

Как указано в других предложениях, вам все равно необходимо проверить, существует ли файл, и при повторной попытке DateTime.Now будет другим, поэтому имя файла будет другим. Конечно, вы не должны получать никаких конфликтов, если скриншоты не отображаются в одной и той же миллисекунде или пользователь не связывается с датой / временем (или переход на летнее время может вас испортить).

2 голосов
/ 17 июля 2013

Вот усовершенствованное решение, изначально предложенное Рексом М. Оно будет генерировать имена файлов, как было задано в настоящем вопросе:

public string GetUniqueName(string name, string folderPath)
{
    string pathAndFileName = Path.Combine(folderPath, name);
    string validatedName = name;
    int count = 1;
    while(File.Exists(Path.Combine(folderPath, validatedName)))
    {
        validatedName = string.Format("{0}{1}{2}",
            Path.GetFileNameWithoutExtension(pathAndFileName),
            count++,
            Path.GetExtension(pathAndFileName));
    }
    return validatedName;
}
0 голосов
/ 16 сентября 2010

Это то, что я использую:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string newPath; List<string> files = new List<string>(Directory.GetFiles(path,"*.txt",SearchOption.TopDirectoryOnly)); for(int i=0; files.Contains(newPath=string.Format(path + @"\textfile{0}.txt",i)); i++) { Console.WriteLine("File:{0} exist skipping....", newPath); } File.WriteAllText(newPath,"dummy");

0 голосов
/ 08 октября 2009

Краткое изложение решения

  1. Directory.GetFiles (Dest);
  2. Сортировать имена файлов
  3. проанализировать последнее имя файла, найти последний использованный номер
  4. написать следующий файл со следующим номером.

будет ли это работать для вас?

0 голосов
/ 08 октября 2009

Поскольку вы пишете файлы, один из подходов состоит в том, чтобы найти текущий каталог сохранения и найти новейший файл с именем ScreenshotXX и использовать регулярное выражение для получения числа из имени.

Для этого можно использовать класс DirectoryInfo вместе с классом Regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...