Как удалить лишнее расширение с файла?

149
16 сентября 2019, 07:10

Имеется файл: name.txt.txt и файл name2.txt.

Пытаюсь с помощью Path.ChangeExtension(); изменить расширение на .bat

Но после замены получаются такие файлы:

name.bat.bat, name2.bat

Вопрос как убрать второе расширение с файла если оно есть?!

Answer 1
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

Answer 2

С путями следует работать с помощью соответствующего встроенного в стандартную библиотеку 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

READ ALSO
Не вылазит окно с оплатой google play

Не вылазит окно с оплатой google play

Решил сделать свой донатный магазин в игре на unityЗарегестрировал в консоли гугл плей свои товары, сделал их активными

105
EF. Fluent API. Указание связей между таблицами

EF. Fluent API. Указание связей между таблицами

Вопрос по дизайну более, чем по какой-то проблемеКак правильно указывать связи между таблицами

122
Обратиться из UserControl к MainWindow MVVM

Обратиться из UserControl к MainWindow MVVM

Подскажите, вот у меня есть UserControl на нем listBox, при нажатии на Item необходимо помещать Page во Frame Content главной формы (MainWindow)Как такое можно провернуть?

109
Unity, проверка наличия компонента в Editor

Unity, проверка наличия компонента в Editor

Недавно решил поиграть с кастомным Unity Editor

124