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


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.