Имеется файл: 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Решил сделать свой донатный магазин в игре на unityЗарегестрировал в консоли гугл плей свои товары, сделал их активными
Вопрос по дизайну более, чем по какой-то проблемеКак правильно указывать связи между таблицами
Подскажите, вот у меня есть UserControl на нем listBox, при нажатии на Item необходимо помещать Page во Frame Content главной формы (MainWindow)Как такое можно провернуть?