วัตถุประสงค์ -C: แยกชื่อไฟล์ออกจากสตริงพา ธ


251

เมื่อฉันมีNSStringกับ/Users/user/Projects/thefile.extฉันต้องการที่จะสกัดthefileด้วยวิธีการ Objective-C

วิธีที่ง่ายที่สุดในการทำเช่นนั้นคืออะไร?


4
[path lastPathComponent] หรือ [[path pathComponents] lastObject] ทั้งสองให้ 'thefile.ext' มีวิธี [path pathExtension] เพื่อรับ 'ext' แต่ไม่เหมือนกันสำหรับชื่อไฟล์
Anton

คำตอบ:


598

นำมาจากการอ้างอิง NSStringคุณสามารถใช้:

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

การlastPathComponentโทรจะส่งคืนthefile.extและstringByDeletingPathExtensionจะลบส่วนต่อท้ายนามสกุลออกจากปลาย


9
lastPathComponentผมไม่เคยได้ยิน ขอบคุณ!
Dimitris

6
โซลูชันอื่นจะเป็นการรวมกันของสิ่งนี้และคำตอบของ Marc: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](ใช้ตัวจัดการไฟล์ใดก็ได้ที่คุณต้องการ) สิ่งนี้ทำให้มั่นใจได้ว่าชื่อไฟล์นั้นถูกแปลเป็นภาษาท้องถิ่นอย่างถูกต้องและส่วนขยายนั้นถูกลบแล้ว
Willurd

1
ขอบคุณมาก! สิ่งนี้ช่วยได้มาก! คุณจะได้รับส่วนขยายได้อย่างไร

20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown

เฮ้นี่มันค่อนข้างน้อยหลังจากการสนทนานี้ แต่ฉันแค่สงสัยบางอย่าง ฉันจะย้อนกลับการกระทำนี้ได้อย่างไร ในที่สุดฉันจะเพิ่มรหัสลงในโปรแกรมของฉันไปยังตำแหน่งที่ฉันสามารถลากและวางไฟล์ได้ฉันจะรับ PATH ITSELF ได้อย่างไรเพื่อให้คอมพิวเตอร์ของฉันสามารถรู้ไฟล์ที่จะเข้าถึงได้ ฉันจะนำไฟล์ที่ป้อนและรับเส้นทางของไฟล์ได้อย่างไร
Christian Kreiter

37

หากคุณกำลังแสดงชื่อไฟล์ที่ผู้ใช้สามารถอ่านได้คุณไม่lastPathComponentต้องการที่จะใช้ ให้ส่งพา ธ เต็มไปยังเมธอด NSFileManager displayNameAtPath:แทน สิ่งนี้โดยทั่วไปแล้วจะทำสิ่งเดียวกันเพียง แต่แปลชื่อไฟล์เป็นภาษาท้องถิ่นอย่างถูกต้องและลบนามสกุลตามการกำหนดลักษณะของผู้ใช้


1
สำหรับบันเดิลคุณอาจต้องการใช้ [[[บันเดิล BundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"] แทน displayNameAtPath มีส่วนขยายที่โค้ดนี้ส่งคืนชื่อที่แปลแล้ว
Peter N Lewis

1
อย่าลืมตรวจสอบ CFBundleDisplayName ก่อน
ปีเตอร์ Hosey

3

มีความเสี่ยงที่จะอยู่ในช่วงปลายปีและนอกหัวข้อ - และแม้ว่าจะมีข้อมูลเชิงลึกที่ยอดเยี่ยมของ @ Marc ใน Swift ดูเหมือนว่า:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.