Member 10714689 Ответов: 3

Автоматическое переименование файла, если он уже существует, с помощью C#


Привет,

Я пытаюсь переименовать файл, если он уже существует.

Вот мой код:

в то время как (файл.Существует(destFile))
{
его доствили = его доствили.Удалить (destFile.Длина - 4);

n += 1;
destFile = строка.Формат("{0}({1}){2}", destFile, n,". csv");
}

Я ожидаю выхода, как:

файл. csv, файл(1).csv, файл(2). csv...

но я получаю результат :
файл.CSV, файлом(1).CSV, файлом(1)(2).CSV, файлом(1)(2)(3).CSV-файл...

Как это исправить?

Любая помощь будет очень признательна.

Что я уже пробовал:

while (File.Exists(destFile))
 {
   destFile = destFile.Remove(destFile.Length - 4);
                              
   n += 1;
   destFile = string.Format("{0}({1}){2}", destFile, n, ".csv");
  }

3 Ответов

Рейтинг:
12

Jochen Arndt

Вы удаляете только расширение". csv". Поэтому, если ваше имя файла "file(1). csv", оно станет "file(1)" + "(2)" + ".csv " = "файл(1) (2). csv".

Чтобы избежать этого, вы должны разделить имя на простое имя, сложенное число и расширение. Затем используйте увеличенный счетчик для построения нового имени.

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

Другим решением было бы получить простое имя вне цикла и использовать его для построения имени:

if (File.Exists(destFile))
{
    int n = 0;
    string plainName = destFile.Remove(destFile.Length - 4);
    string newName;
    do
    {
        n++;
        newName = string.Format("{0}({1}){2}", plainName, n, ".csv");
    }
    while (File.Exists(newName));
}


#realJSOP

Я бы использовал различные методы File.IO.Path.Getxxx, чтобы разбить имя файла на части вместо жесткого кодирования ".csv", но в остальном это ответ.

Рейтинг:
1

Richard MacCutchan

Да потому что вы используете одну и ту же переменную (destfile) каждый раз вокруг вашей петли.
Итерация 1: destfile = file. csv
Итерация 2: destfile = file (1). csv
Итерация 3: destfile = file (1)(2). csv

Вам нужно разобрать любой (n) части имени файла перед добавлением следующего.


Member 10714689

спасибо за быстрый ответ. Есть ли какой-нибудь быстрый способ разобрать (n) частей в c#?

Richard MacCutchan

Вероятно, вам было бы лучше использовать регулярное выражение. Видеть Класс Регулярных Выражений (System. Text.RegularExpressions)[^].

Рейтинг:
1

Member 10714689

наконец-то решен этот вопрос.

Вот мой код:

использование системы.ИО; // подключаем пространство имен

int n = 0;
в то время как (файл.Существует(destFile))
{
его доствили = его доствили.Удалить (destFile.Длина - 4);
если (его доствили.Содержит('('))
{
инт underscoreIndex = его доствили.LastIndexOf("(");
его доствили = его доствили.Подстрока(0, underscoreIndex);
}
n += 1;
destFile = строка.Формат("{0}({1}){2}", destFile, n,". csv");
}