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

202

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

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

tweetypi
источник

Ответы:

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);
phdesign
источник
@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

Benjym
источник
2
А что если мой разделитель каталогов - '/';)?
Logman
4
Используйте, Path.Combine()а не указав "\\".
Broots Waymb
1

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

шраддха
источник
1

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

sudoer
источник
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;
    }
shmaltzy
источник
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
Большая часть кода совершенно не имеет значения. Объяснение отсутствует. Это не полезно.
Палек
Код слишком специфичен для проблемы, отличной от рассматриваемой.
Доминик Бетт
-4

Эта реализация должна работать.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");
Доминик Бетт
источник
11
Как насчет abc.txt.pdf? :-)
Палек