Видаліть розширення файлу з рядка імені файлу


201

Якщо у мене є рядковий вислів "abc.txt", чи є швидкий спосіб отримати підрядок, що є справедливим "abc"?

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

Відповіді:


372

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


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

4
Збереження шляху не є бажаним ефектом, зауважте, що назва методу - GetFileNameWithoutExtension. Якщо обіцяно збереження шляху, то назва методу мала бути іншою. Опис методу також досить специфічний, повертається лише ім'я файлу без розширення. ОП не вказує, що йому потрібен шлях. Зовсім навпаки.
— Мортен Борк

@dukevin нічого з цього питання не має нічого спільного з цим шляхом. Він просто просить видалити розширення з імені файлу .
— Рорі Маккросан

248

Для цієї мети існує метод, який дозволить зберегти повний шлях, крім розширення.

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

Якщо потрібне лише ім'я файлу, використовуйте

System.IO.Path.GetFileNameWithoutExtension(path);

37
Це правильна відповідь. Шлях до файлу смужок відповідей
— лимон

8
Це краща відповідь, оскільки вона зберігає шлях
— Джеймс Н

8
Тут nullє магічне значення. Якщо ви використовуєте String.Emptyака, ""вам залишиться .крапка [ ].
— THBBFT

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

57

Можна використовувати

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

А потім видаліть розширення вручну:

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

@Bio, насправді, що отримує довжину розширення, а потім захоплює ім'я файлу до розширення.
— Невіл

Якщо ви вирішили ігнорувати System.IO.Path, функціональність не краща, якщо ви отримаєте розширення як: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
— QMaster

27

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
А що робити, якщо мій роздільник каталогів '/';)?
— Логман

4
Використовуйте, Path.Combine()а не вказуючи "\\".
— Broots Waymb

1

якщо ви хочете використовувати String-операцію, ви можете використовувати функцію 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.