Hapus ekstensi file dari string nama file


201

Jika saya memiliki string yang mengatakan "abc.txt", apakah ada cara cepat untuk mendapatkan substring yang adil"abc" ?

Saya tidak dapat melakukan fileName.IndexOf('.')karena nama file bisa "abc.123.txt"atau sesuatu dan saya jelas hanya ingin menyingkirkan ekstensi (yaitu "abc.123").

Jawaban:


372

The Path.GetFileNameWithoutExtensionMetode memberikan nama file Anda lulus sebagai argumen tanpa ekstensi, seperti harus jelas dari nama.


1
Akan menyarankan: string.Format ("{0} \\ {1}", Path.GetDirectoryName (path), Path.GetFileNameWithoutExtension (path)) ... tapi saya melihat versi yang lebih baik di bawah ini menggunakan Path.Combine alih-alih String.Format!
emery.noel

4
Mempertahankan jalur bukan efek yang diinginkan, perhatikan bahwa nama metode adalah GetFileNameWithoutExtension. Jika pelestarian jalur dijanjikan, maka nama metode seharusnya berbeda. Deskripsi metode juga cukup spesifik, hanya nama file tanpa ekstensi yang dikembalikan. OP tidak menentukan bahwa ia membutuhkan path. Justru sebaliknya.
Morten Bork

@dukevin tidak ada tentang pertanyaan ini ada hubungannya dengan jalan. Itu hanya meminta penghapusan ekstensi dari nama file .
Rory McCrossan

248

Ada metode dalam kerangka kerja untuk tujuan ini, yang akan menjaga jalur penuh kecuali ekstensi.

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

Jika hanya nama file yang diperlukan, gunakan

System.IO.Path.GetFileNameWithoutExtension(path);

37
Ini jawaban yang benar. Jalur file strip jawaban yang diterima
lemon

8
Ini adalah jawaban yang lebih baik karena mempertahankan jalan
James H

8
The nullmemiliki nilai sihir di sini. Jika Anda menggunakan String.Emptyalias, ""Anda akan dibiarkan dengan titik [ .] tertinggal .
THBBFT

Saya tidak setuju jawaban ini lebih baik. GetFileNameWithoutExtensionlebih eksplisit. Walaupun itu bagus mengetahui tentang efek samping yang mungkin tidak diinginkan dan adanya alternatif untuk menghindarinya.
jeromej

57

Kamu bisa memakai

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

Dan kemudian hapus ekstensi secara manual:

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

@Bio, sebenarnya itu adalah panjang ekstensi, dan kemudian ambil nama file sampai ekstensi.
Neville

Jika Anda memutuskan untuk mengabaikan fungsionalitas System.IO.Path tidak lebih baik jika Anda mendapatkan ekstensi sebagai: string extension = filename.Substring (filename.LastIndexOf ('.')); ?
QMaster

27

String.LastIndexOf akan berfungsi.

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

10
Hati-hati terhadap file tanpa ekstensi, seperti foo/bar.cat/cheese!
Cameron

String.LastIndexOfberbahaya untuk mencapai sesuatu seperti ini. Untuk file tanpa ekstensi, seperti @Cameron telah katakan di atas, hasil Anda mungkin tidak seperti yang Anda inginkan. Cara paling aman untuk melakukan ini adalah menggunakan jawaban @ Logman di atas.
Siwa

13

Jika Anda ingin membuat jalur lengkap tanpa ekstensi, Anda dapat melakukan sesuatu seperti ini:

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

tapi saya mencari cara yang lebih sederhana untuk melakukan itu. Adakah yang punya ide?


8

Saya menggunakan kode di bawah ini, lebih sedikit

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

Output akan menjadi

C: \ file


2
Dan bagaimana jika pemisah direktori saya adalah '/';)?
Logman

4
Gunakan Path.Combine()daripada menentukan "\\".
Broots Waymb

1

jika Anda ingin menggunakan operasi String maka Anda dapat menggunakan fungsi lastIndexOf () yang mencari kejadian terakhir dari karakter atau substring. Java memiliki banyak fungsi string.


1

Anda mungkin tidak meminta api UWP. Namun dalam UWP, file.DisplayNameadalah nama tanpa ekstensi. Semoga bermanfaat buat orang lain.


0

Saya tahu ini adalah pertanyaan lama dan Path.GetFileNameWithoutExtensionmerupakan pilihan yang lebih baik dan mungkin lebih bersih. Tetapi secara pribadi saya telah menambahkan dua metode ini ke proyek saya dan ingin membagikannya. Ini membutuhkan C # 8.0 karena menggunakan rentang dan indeks.

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
Ini tidak menjawab pertanyaan.
Rapptz

1
Mengapa Anda menulis metode ekstensi untuk ini? Selain dari kasus yang sangat spesifik ini, String.GetFileExtension () tidak masuk akal sama sekali. Namun, fungsi ini dibawa ke mana-mana, dan itu seharusnya menunjukkan perilaku khusus untuk String apa pun. Yang tidak demikian.

-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!!!");
            }
        }

Tolong jangan hanya mengirim kode, itu jauh lebih bermanfaat untuk menjelaskan jawaban Anda di samping kode.
SuperBiasedMan

1
Sebagian besar kode sama sekali tidak relevan. Penjelasan tidak ada. Ini tidak berguna.
Palec

Kode ini terlalu spesifik untuk masalah yang berbeda dari yang dimaksud.
Dominic Bett

-4

Implementasi ini harus bekerja.

string file = "abc.txt";
string fileNoExtension = file.Replace(".txt", "");

11
Bagaimana dengan abc.txt.pdf? :-)
Palec
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.