2009-07-08 35 views
241

Khi tôi có NSString với /Users/user/Projects/thefile.ext Tôi muốn trích xuất thefile với các phương pháp Mục tiêu-C.Mục tiêu-C: Trích xuất tên tệp từ chuỗi đường dẫn

Cách dễ nhất để làm điều đó là gì?

+4

[đường dẫn lastPathComponent] hoặc [[đường dẫn pathComponents] lastObject]. Cả hai đều cho 'thefile.ext'. Có phương thức [path pathExtension] để lấy 'ext' nhưng không giống với tên tệp. – Anton

Trả lời

581

Taken từ the NSString reference, bạn có thể sử dụng:

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

Cuộc gọi lastPathComponent sẽ trở lại thefile.ext, và stringByDeletingPathExtension sẽ loại bỏ các suffic mở rộng từ kết thúc.

+3

OMG! Cảm ơn bạn, cảm ơn bạn, cảm ơn bạn! – Anton

+9

Tôi chưa bao giờ nghe nói về 'lastPathComponent'. Cảm ơn bạn! – Dimitris

+5

Một giải pháp khác sẽ là sự kết hợp của câu trả lời này và câu trả lời của Marc: '[[[NSFileManager defaultManager] displayNameAtPath: path] stringByDeletingPathExtension]' (sử dụng bất kỳ trình quản lý tệp nào bạn muốn). Điều này đảm bảo tên tệp được bản địa hóa chính xác và tiện ích mở rộng đã bị xóa. – willurd

37

Nếu bạn đang hiển thị tên tệp có thể đọc được, bạn hãy không muốn sử dụng lastPathComponent. Thay vào đó, chuyển đường dẫn đầy đủ tới phương thức displayNameAtPath: của NSFileManager. Điều này về cơ bản không làm điều tương tự, chỉ có nó địa phương hóa một cách chính xác tên tập tin và loại bỏ phần mở rộng dựa trên sở thích của người dùng.

+1

Đối với nhóm, bạn có thể muốn sử dụng [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"] để thay thế. displayNameAtPath bao gồm phần mở rộng trong đó mã này trả về tên được bản địa hoá. –

+1

Đừng quên kiểm tra CFBundleDisplayName trước. –

3

Tại nguy cơ bị năm cuối và tắt chủ đề - và mặc dù @ cái nhìn sâu sắc tuyệt vời của Marc, trong Swift nó trông giống như:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent 
Các vấn đề liên quan