Mendapatkan nama file tanpa ekstensi

279

Saat mendapatkan nama file di folder tertentu:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
    builder.Append(fi.Name);
    builder.Append(", ");
    ...
}

fi.Namememberi saya nama file dengan ekstensi: file1.txt, file2.txt, file3.txt.

Bagaimana saya bisa mendapatkan nama file tanpa ekstensi? ( file1, file2, file3)

rem
sumber

Jawaban:

479

Anda bisa menggunakan Path.GetFileNameWithoutExtension:

foreach (FileInfo fi in smFiles)
{
    builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
    builder.Append(", ");
}

Meskipun saya terkejut tidak ada cara untuk mendapatkan ini langsung dari FileInfo(atau setidaknya saya tidak bisa melihatnya).

Rup
sumber
7
Dan untuk mendapatkan ekstensi (untuk ditambahkan nanti misalnya) gunakan: Path.GetExtension (fileName);
Justin
2
@ Jeffzz Itu berguna jika Anda bekerja dengan string kosong, tetapi jika Anda sudah memiliki objek FileInfo, tidak perlu repot dengan Path. FileInfo sudah menyediakan properti "Extension" untuk tujuan itu.
jmbpiano
Saya mendapat kesalahan "'pembangun' tidak ada dalam konteks saat ini". Saya menambahkan 'system.Text' tetapi masih mengalami kesalahan yang sama. Apa alasannya?
ffttyy
@ffttyy builderakan menjadi turunan dari StringBuilderdalam kode OP. Ini hanya contoh penggunaan GetFileNameWithoutExtension - Anda mungkin akan lebih baik menulis kode Anda sendiri yang menyebutnya.
Rup
9
Satu hal yang perlu diperhatikan di sini adalah jika file Anda berisi ekstensi ganda, GetFileNameWithoutExtensionhanya menghapus ekstensi akhir . Misalnya, nama file example.es6.jsakan menjadiexample.es6
David Roberts
48

Gunakan Path.GetFileNameWithoutExtension().

Marcel Gheorghita
sumber
Perhatikan bahwa Path.GetFileNameWithoutExtension bukan cara terbaik karena memeriksa chars path yang tidak valid dan mencoba untuk mengekstrak DirectorySeparatorChar, AltDirectorySeparatorChar atau VolumeSeparatorChar dalam sebuah loop yang tampaknya tidak diperlukan untuk nama file (bukan path lengkap)!
S.Serpooshan
22

Solusi ini juga mencegah penambahan koma tertinggal.

var filenames = String.Join(
                    ", ",
                    Directory.GetFiles(@"c:\", "*.txt")
                       .Select(filename => 
                           Path.GetFileNameWithoutExtension(filename)));

Saya tidak suka DirectoryInfo, FileInfo untuk skenario ini.

DirectoryInfo dan FileInfo mengumpulkan lebih banyak data tentang folder dan file daripada yang diperlukan sehingga mereka membutuhkan lebih banyak waktu dan memori daripada yang diperlukan.

Erno
sumber
2
+1. Saya juga lebih suka Directory.GetFilessetiap hari DirectoryInfo.GetFiles, jika semua yang saya inginkan adalah nama file.
Yogesh
Saya suka ini karena String.Join, LINQ, tidak ada StringBuilder.
Csaba Toth
Jika Anda melihat kode sumbernya. Konstruktor FileInfo sangat ringan. Dan semua informasi yang Anda lihat dilakukan melalui properti. Mereka hanya berkumpul ketika Anda memanggil mereka
fjch1997
@ fjch1997 - Konstruktor memanggil Path.GetFileName dan memeriksa izin. Jadi itu agak berlebihan.
Erno
@ErnodeWeerd FileIOPermission tidak memeriksa izin terhadap ACL. alih-alih ini semacam mekanisme di .NET untuk memeriksa izin untuk kode yang tepercaya sebagian. Jadi, seharusnya tidak membuat panggilan IO yang sebenarnya. Berapa dampaknya terhadap kinerja? saya tidak bisa mengatakan tanpa pengujian. Tapi saya berasumsi itu tidak terlalu bagus
fjch1997
10

Gunakan Path.GetFileNameWithoutExtension. Path ada di namespace System.IO.

Pradeep
sumber
6

Sebagai jawaban tambahan (atau untuk menambah jawaban yang ada) Anda bisa menulis metode ekstensi untuk mencapai ini untuk Anda dalam kelas DirectoryInfo. Berikut adalah contoh yang saya tulis dengan cukup cepat yang dapat diperindah untuk memberikan nama direktori atau kriteria lain untuk modifikasi, dll:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace DocumentDistributor.Library
{
    public static class myExtensions
    {
        public static string[] GetFileNamesWithoutFileExtensions(this DirectoryInfo di)
        {
            FileInfo[] fi = di.GetFiles();
            List<string> returnValue = new List<string>();

            for (int i = 0; i < fi.Length; i++)
            {
                returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); 
            }

            return returnValue.ToArray<string>();
         }
    }
}

Sunting: Saya juga berpikir metode ini mungkin bisa disederhanakan atau dikejutkan jika menggunakan LINQ untuk mencapai konstruksi array, tapi saya tidak punya pengalaman dalam LINQ untuk melakukannya dengan cukup cepat untuk sampel semacam ini.

Sunting 2 (hampir 4 tahun kemudian): Ini adalah metode LINQ-ified yang akan saya gunakan:

public static class myExtensions
{
    public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di)
    {
        return di.GetFiles()
            .Select(x => Path.GetFileNameWithoutExtension(x.FullName));
    }
}
Joel Etherton
sumber
5

FileInfo tahu ekstensinya sendiri, jadi Anda bisa menghapusnya

fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");

atau jika Anda paranoid bahwa itu mungkin muncul di tengah, atau ingin mengoptimalkan mikro:

file.Name.Substring(0, file.Name.Length - file.Extension.Length)
drzaus
sumber
4

jika nama file berisi direktori dan Anda tidak perlu kehilangan direktori:

fileName.Remove(fileName.LastIndexOf("."))
Omid-RH
sumber
2

coba ini,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];
Ali CAKIL
sumber
1

Sebagai catatan:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
string fileNames = String.Join(", ", smFiles.Select<FileInfo, string>(fi => Path.GetFileNameWithoutExtension(fi.FullName)));

Dengan cara ini Anda tidak menggunakan StringBuildertetapi String.Join(). Tolong juga komentar yang Path.GetFileNameWithoutExtension()membutuhkan path lengkap ( fi.FullName), tidak fi.Nameseperti yang saya lihat di salah satu jawaban lain.

Papuashu
sumber
-5
using System;

using System.IO;

public class GetwithoutExtension
{

    public static void Main()
    {
        //D:Dir dhould exists in ur system
        DirectoryInfo dir1 = new DirectoryInfo(@"D:Dir");
        FileInfo [] files = dir1.GetFiles("*xls", SearchOption.AllDirectories);
        foreach (FileInfo f in files)
        {
            string filename = f.Name.ToString();
            filename= filename.Replace(".xls", "");
            Console.WriteLine(filename);
        }
        Console.ReadKey();

    }

}
Tisho
sumber
5
Anda sepertinya tidak menyadari bahwa sudah ada kelas Framework yang melakukan ini untuk Anda.
Andrew Barber
3
Juga, jika seseorang menamai file mereka "Current.XLSFiles.xls" ini akan menyebabkan masalah NYATA.
Tom Padilla
@ TomPadilla mengapa ini menyebabkan masalah?
Luke101
Karena metode ini akan menampilkan "Current.files" sebagai nama file. Karena setiap instance ".xls" akan diganti dengan "", termasuk yang ada di tengah nama.
Tom Padilla