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").

tweetypi
sumber

Jawaban:

372

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

R. Martinho Fernandes
sumber
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);
Ran QUAN
sumber
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);
desain
sumber
@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);
Andrew
sumber
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?

Tukang tebang kayu
sumber
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

Benjym
sumber
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.

Shradda
sumber
1

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

sudoer
sumber
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);
}
Emiliano Ruiz
sumber
-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
sumber
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!!!");
            }
        }
Prashant Chavan
sumber
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", "");
Dominic Bett
sumber
11
Bagaimana dengan abc.txt.pdf? :-)
Palec