Objective-C: Ekstrak nama file dari path string

251

Ketika saya sudah NSStringdengan /Users/user/Projects/thefile.extsaya ingin mengekstrak thefiledengan metode Objective-C.

Apa cara termudah untuk melakukan itu?

Anton
sumber
4
[path lastPathComponent] atau [[path pathComponents] lastObject]. Keduanya memberikan 'thefile.ext'. Ada metode [path pathExtension] untuk mendapatkan 'ext' tetapi tidak sama untuk nama file.
Anton

Jawaban:

598

Diambil dari referensi NSString , Anda dapat menggunakan:

NSString *theFileName = [[string lastPathComponent] stringByDeletingPathExtension];

The lastPathComponentpanggilan akan kembali thefile.ext, dan stringByDeletingPathExtensionakan menghapus akhiran ekstensi dari akhir.

Peter
sumber
9
Saya tidak pernah mendengarnya lastPathComponent. Terima kasih!
Dimitris
6
Solusi lain adalah kombinasi dari ini dan jawaban Marc: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](gunakan file manager apa pun yang Anda inginkan). Ini memastikan nama file dilokalkan dengan benar, dan ekstensi telah dihapus.
willurd
1
Terima kasih banyak! Ini sangat membantu! Bagaimana Anda HANYA mendapatkan ekstensi?
20
@ TwoDumplingNSString *myExtension = [myString pathExtension]
chown
Hei, ini sedikit setelah diskusi ini, tapi aku hanya ingin tahu sesuatu. Bagaimana saya membalikkan tindakan ini? Saya akhirnya akan menambahkan beberapa kode ke program saya ke tempat saya dapat menyeret dan meletakkan file. Bagaimana cara mendapatkan PATH ITSELF, sehingga komputer saya dapat mengetahui file mana yang harus diakses? Bagaimana cara saya mengambil file yang dimasukkan dan mendapatkan jalur file?
Christian Kreiter
37

Jika Anda menampilkan nama file yang dapat dibaca pengguna, Anda tidak ingin menggunakannya lastPathComponent. Alih-alih, berikan path lengkap ke displayNameAtPath:metode NSFileManager . Ini pada dasarnya melakukan hal yang sama, hanya itu dengan benar melokalkan nama file dan menghapus ekstensi berdasarkan preferensi pengguna.

Marc Charbonneau
sumber
1
Untuk bundel, Anda mungkin ingin menggunakan [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"] sebagai gantinya. displayNameAtPath termasuk ekstensi tempat kode ini mengembalikan nama yang dilokalkan.
Peter N Lewis
1
Jangan lupa untuk memeriksa CFBundleDisplayName terlebih dahulu.
Peter Hosey
3

Dengan risiko bertahun-tahun terlambat dan keluar dari topik - dan meskipun wawasan luar biasa @ Marc, di Swift sepertinya:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Chris Conover
sumber