Saya memprogram dalam WPF C #. Saya punya misalnya jalur berikut:
C:\Program Files\hello.txt
dan saya ingin mengekstraknya hello
.
Path tersebut string
diambil dari database. Saat ini saya menggunakan kode berikut untuk membagi jalur '\'
dan kemudian membagi lagi dengan '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Ini bekerja, tetapi saya percaya harus ada solusi yang lebih pendek dan lebih cerdas untuk itu. Ada ide?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
mengembalikan string yang sama dan tidak mengubahnya menjadi "file.cs" karena suatu alasan. Jika saya menyalin / menempelkan kode saya ke kompiler online (seperti rextester.com ), apakah itu berfungsi ...?Jawaban:
Path.GetFileName
Path.GetFileNameWithoutExtension
Kelas Path luar biasa.
sumber
mencoba
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
sumber
mencoba
demo
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
sumber
Anda dapat menggunakan Path API sebagai berikut:
Info lebih lanjut: Path.GetFileNameWithoutExtension
sumber
Path.GetFileNameWithoutExtension
sumber
Coba ini:
Ini akan mengembalikan "halo" untuk nama file.
sumber
sumber
Coba ini,
sumber
sumber
FileVersionInfo
dapat digunakan pada file yang tidak memiliki informasi versi. Perhatikan bahwaGetVersionInfo()
hanya dapat digunakan pada jalur yang mereferensikan file yang sudah ada. Sementara kedua kelas dapat digunakan untuk mendapatkan nama file, pertanyaannya juga diminta untuk menghapus ekstensi.Pertama, kode dalam pertanyaan tidak menghasilkan output yang dijelaskan. Itu mengekstrak ekstensi file (
"txt"
) dan bukan nama file dasar ("hello"
). Untuk melakukan itu baris terakhir harus memanggilFirst()
, bukanLast()
, seperti ini ...Setelah melakukan perubahan itu, satu hal yang perlu dipikirkan sejauh memperbaiki kode ini adalah jumlah sampah yang dihasilkannya:
string[]
mengandungstring
untuk setiap segmen jalur dipath
string[]
mengandung setidaknya satustring
untuk masing-masing.
di segmen jalur terakhir dipath
Oleh karena itu, mengekstraksi nama file dasar dari jalur sampel
"C:\Program Files\hello.txt"
harus menghasilkan (sementara)object
s"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, seorangstring[3]
, danstring[2]
. Ini bisa menjadi signifikan jika metode ini dipanggil pada sejumlah besar jalur. Untuk memperbaiki ini, kita dapat mencaripath
diri kita sendiri untuk menemukan titik awal dan akhir dari nama dasar dan menggunakan mereka untuk membuat satu barustring
...Ini menggunakan indeks karakter setelah yang terakhir
\
sebagai awal nama dasar, dan dari sana mencari yang pertama.
untuk digunakan sebagai indeks karakter setelah akhir nama dasar. Apakah ini lebih pendek dari kode aslinya? Tidak terlalu. Apakah ini solusi "lebih pintar"? Aku pikir begitu. Setidaknya, itu akan terjadi jika bukan karena fakta bahwa ...Seperti yang Anda lihat dari komentar, metode sebelumnya bermasalah. Meskipun berfungsi jika Anda menganggap semua jalur diakhiri dengan nama file dengan ekstensi, itu akan menimbulkan pengecualian jika jalur berakhir dengan
\
(yaitu jalur direktori) atau tidak mengandung ekstensi di segmen terakhir. Untuk memperbaiki ini, kita perlu menambahkan pemeriksaan tambahan untuk akun ketikaendIndex
adalah-1
(yaitu.
tidak ditemukan) ...Sekarang versi ini jauh lebih pendek daripada yang asli, tetapi lebih efisien dan (sekarang) benar juga.
Sejauh metode .NET yang menerapkan fungsi ini, banyak jawaban lain menyarankan menggunakan
Path.GetFileNameWithoutExtension()
, yang merupakan solusi yang jelas dan mudah tetapi tidak menghasilkan hasil yang sama dengan kode dalam pertanyaan. Ada perbedaan yang halus tetapi penting antaraGetFileBaseNameUsingSplit()
danPath.GetFileNameWithoutExtension()
(diGetFileBaseNameUsingPath()
bawah): yang pertama mengekstrak semua sebelum pertama.
dan yang kedua mengekstraksi segalanya sebelum yang terakhir.
. Ini tidak membuat perbedaan untuk sampelpath
dalam pertanyaan, tetapi lihat tabel ini membandingkan hasil dari empat metode di atas ketika dipanggil dengan berbagai jalur ...... dan Anda akan melihat bahwa
Path.GetFileNameWithoutExtension()
menghasilkan hasil yang berbeda ketika melewati jalur di mana nama file memiliki ekstensi ganda atau memimpin dan / atau mengikuti.
. Anda dapat mencobanya sendiri dengan kode berikut ...TL; DR Kode dalam pertanyaan tidak berperilaku seperti yang banyak diharapkan dalam beberapa kasus sudut. Jika Anda akan menulis kode manipulasi jalur Anda sendiri, pastikan untuk mempertimbangkan ...
.
atau semuanya sebelum yang terakhir.
?).
.
(mungkin bukan sesuatu yang pernah Anda temui di Windows, tetapi itu adalah mungkin ).
\
Tidak semua jalur file mengikuti rumus biasa
X:\Directory\File.ext
!sumber
sumber