Удалить расширение файла из строки имени файла


202

Если у меня есть строка, говорящая "abc.txt", есть ли быстрый способ получить подстроку, которая просто "abc"?

Я не могу сделать, fileName.IndexOf('.')потому что имя файла может быть "abc.123.txt"или что-то, и я, очевидно, просто хочу избавиться от расширения (то есть "abc.123").

Ответы:


373

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


1
Я собирался предложить: string.Format ("{0} \\ {1}", Path.GetDirectoryName (путь), Path.GetFileNameWithoutExtension (путь)) ... но я видел еще лучшую версию ниже, используя Path.Combine вместо String.Format!
emery.noel

4
Сохранение пути не является желаемым эффектом, обратите внимание, что имя метода - GetFileNameWithoutExtension. Если было обещано сохранение пути, тогда имя метода должно было быть другим. Описание метода также довольно специфично, возвращается только имя файла без расширения. ОП не указывает, что ему нужен путь. Наоборот.
Мортен Борк

@dukevin ничего об этом вопросе не имеет никакого отношения к пути. Он просто просит удалить расширение из имени файла .
Рори МакКроссан

249

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

System.IO.Path.ChangeExtension(path, null);

Если нужно только имя файла, используйте

System.IO.Path.GetFileNameWithoutExtension(path);

37
Это правильный ответ. Принятый ответ полоски пути к файлу
лимон

8
Это лучший ответ, поскольку он сохраняет путь
Джеймс Х

8
Здесь nullесть волшебная ценность. Если вы используете String.Emptyaka, у ""вас останется конечная .точка [ ].
THBBFT

Я не согласен, этот ответ лучше. GetFileNameWithoutExtensionболее явно. Хотя приятно знать о потенциально нежелательном побочном эффекте и существовании альтернативы, позволяющей избежать этого.
Иеромей

57

Ты можешь использовать

string extension = System.IO.Path.GetExtension(filename);

А затем удалите расширение вручную:

string result = filename.Substring(0, filename.Length - extension.Length);

@Bio, на самом деле это get - это длина расширения, а затем поиск имени файла вплоть до расширения.
Невилл

Если вы решили игнорировать функциональность System.IO.Path, то не лучше, если вы получите расширение как: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

28

String.LastIndexOf будет работать.

string fileName= "abc.123.txt";
int fileExtPos = fileName.LastIndexOf(".");
if (fileExtPos >= 0 )
 fileName= fileName.Substring(0, fileExtPos);

10
Следите за файлами без расширения, как foo/bar.cat/cheese!
Кэмерон

String.LastIndexOfопасно для выполнения чего-то вроде этого. Для файлов без расширения, как было сказано выше @Cameron, ваши результаты могут быть не такими, как вы хотите. Самый безопасный способ сделать это - использовать ответ @ Logman выше.
Шива

13

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

Path.Combine( Path.GetDirectoryName(fullPath), Path.GetFileNameWithoutExtension(fullPath))

но я ищу более простой способ сделать это. У кого-нибудь есть идеи?


8

Я использовал ниже, меньше кода

string fileName = "C:\file.docx";
MessageBox.Show(Path.Combine(Path.GetDirectoryName(fileName),Path.GetFileNameWithoutExtension(fileName)));

Выход будет

\ Файл: C


2
А что если мой разделитель каталогов - '/';)?
Logman

4
Используйте, Path.Combine()а не указав "\\".
Broots Waymb

1

если вы хотите использовать строковую операцию, то вы можете использовать функцию lastIndexOf (), которая ищет последнее вхождение символа или подстроки. Java имеет множество строковых функций.


1

Вы, возможно, не спрашиваете API UWP. Но в UWP file.DisplayNameэто имя без расширений. Надеюсь, полезно для других.


0

Я знаю, что это старый вопрос, и Path.GetFileNameWithoutExtensionэто лучший и, возможно, более чистый вариант. Но лично я добавил эти два метода в свой проект и хотел поделиться ими. Это требует C # 8.0 из-за использования диапазонов и индексов.

public static string RemoveExtension(this string file) => ReplaceExtension(file, null);

public static string ReplaceExtension(this string file, string extension)
{
    var split = file.Split('.');

    if (string.IsNullOrEmpty(extension))
        return string.Join(".", split[..^1]);

    split[^1] = extension;

    return string.Join(".", split);
}

-1
    /// <summary>
    /// Get the extension from the given filename
    /// </summary>
    /// <param name="fileName">the given filename ie:abc.123.txt</param>
    /// <returns>the extension ie:txt</returns>
    public static string GetFileExtension(this string fileName)
    {
        string ext = string.Empty;
        int fileExtPos = fileName.LastIndexOf(".", StringComparison.Ordinal);
        if (fileExtPos >= 0)
            ext = fileName.Substring(fileExtPos, fileName.Length - fileExtPos);

        return ext;
    }

2
Это не отвечает на вопрос.
Раппц

1
Зачем вам писать метод расширения для этого? Помимо этого очень специфического случая, String.GetFileExtension () не имеет никакого смысла. Однако функция переносится повсюду, и она должна обозначать поведение, характерное для любой строки. Что не так.

-3
        private void btnfilebrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.ShowDialog();
            dlg.Filter = "CSV files (*.csv)|*.csv|XML files (*.xml)|*.xml";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string fileName;
                fileName = dlg.FileName;
                string filecopy;
                filecopy = dlg.FileName;
                filecopy = Path.GetFileName(filecopy);
                string strFilename;
                strFilename = filecopy;
                 strFilename = strFilename.Substring(0, strFilename.LastIndexOf('.'));
                //fileName = Path.GetFileName(fileName);             

                txtfilepath.Text = strFilename;

                string filedest = System.IO.Path.GetFullPath(".\\Excels_Read\\'"+txtfilepath.Text+"'.csv");
               // filedest = "C:\\Users\\adm\\Documents\\Visual Studio 2010\\Projects\\ConvertFile\\ConvertFile\\Excels_Read";
                FileInfo file = new FileInfo(fileName);
                file.CopyTo(filedest);
             // File.Copy(fileName, filedest,true);
                MessageBox.Show("Import Done!!!");
            }
        }

Пожалуйста, не просто отправляйте код, гораздо полезнее объяснить ваш ответ вместе с кодом.
SuperBiasedMan

1
Большая часть кода совершенно не имеет значения. Объяснение отсутствует. Это не полезно.
Палек

Код слишком специфичен для проблемы, отличной от рассматриваемой.
Доминик Бетт

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.