Имеется файл: name.txt.txt и файл name2.txt.
Пытаюсь с помощью Path.ChangeExtension(); изменить расширение на .bat
Но после замены получаются такие файлы:
name.bat.bat, name2.bat
Вопрос как убрать второе расширение с файла если оно есть?!
public static string ClearExtension(string file)
=> string.Join(".", file.Split('.').Take(2));
Проверяем:
Console.WriteLine(ClearExtension("file.txt.txt.txt"));
Console.WriteLine(ClearExtension("file.txt.txt"));
Console.WriteLine(ClearExtension("file.txt"));
Console.WriteLine(ClearExtension("file"));
file.txt
file.txt
file.txt
file
Можно пойти таким путем:
public static string ClearExtension(string file)
=> string.Join(".", file.Split('.').Distinct());
Данный вариант просто удалит все повторы и тут есть свои недостатки. Например file.txt.log не изменится, ибо нету дублей, или 127.0.0.1.log.log выдаст 127.0.1.log (удалил лишнее).
Поэтому мне кажется, что надо знать какую то отправную точку, например выписать все доступные расширения файлов в некий массив, так программа будет почти четко различать имя от расширения.
Примерно что то в этом духе:
private static string[] Extensions = { ".txt", ".log", ".bin", ".bat" };
public static string ClearExtension(string file)
{
var fileName = Path.GetFileName(file);
var dir = Path.GetDirectoryName(file);
var arr = Regex.Split(fileName.ToLower(), @"(?=[.])");
var extension = arr.Last(x => Extensions.Contains(x));
var name = string.Join(null, arr.Where(x => !Extensions.Contains(x)));
return !string.IsNullOrWhiteSpace(dir) ? dir + "\\" + name + extension : name + extension;
}
Тогда 127.0.0.1.bat.log успешно переведется в 127.0.0.1.log.
Или C:\\MS.NET\\1.1.1.1.2.txt.log.bat.bin.log выдаст C:\MS.NET\1.1.1.1.2.log
С путями следует работать с помощью соответствующего встроенного в стандартную библиотеку API. Например, для удаления "многозначного" расширения файла можно написать что-то вроде:
public static string ClearExtension(string path)
{
var result = path;
do
{
path = result;
result = Path.Combine(
Path.GetDirectoryName(path),
Path.GetFileNameWithoutExtension(path));
}
while (result != path);
return result;
}
Тогда
var s = @"C:\MS.NET\name.txt.txt.txt.txt.txt";
Console.WriteLine(ClearExtension(s));
Выведет C:\MS.NET\name
Ну и затем можно добавить новое расширение с помощью обычной конкатенации:
var r = ClearExtension(s) + ".bat";
Console.WriteLine(r);
Выведет C:\MS.NET\name.bat
Сборка персонального компьютера от Artline: умный выбор для современных пользователей