Objective-C: Trích xuất tên tệp từ chuỗi đường dẫn


251

Khi tôi có NSStringvới /Users/user/Projects/thefile.exttôi muốn trích xuất thefilevới các phương pháp Objective-C.

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


4
[path lastPathComponent] hoặc [[path 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

Câu trả lời:


598

Lấy từ tham chiếu NSString , bạn có thể sử dụng:

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

Cuộc lastPathComponentgọi sẽ trở lại thefile.extstringByDeletingPathExtensionsẽ loại bỏ hậu tố mở rộng từ cuối.


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

6
Một giải pháp khác sẽ là sự kết hợp giữ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à phần mở rộng đã bị xóa.
trả lời

1
Cảm ơn bạn rất nhiều! Điều này đã giúp rất nhiều! Làm thế nào bạn CHỈ có được phần mở rộng mặc dù?

20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown

Này, đây là một chút sau cuộc thảo luận này, nhưng tôi chỉ đang tự hỏi điều gì đó. Làm thế nào tôi có thể đảo ngược hành động này? Cuối cùng tôi sẽ thêm một số mã vào chương trình của mình vào nơi tôi có thể kéo và thả tệp vào. Làm cách nào để lấy PATH ITSELF, để máy tính của tôi có thể biết tệp nào sẽ truy cập? Làm cách nào để lấy tệp đã nhập và nhận đường dẫn của tệp?
Christian Kreiter

37

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


1
Đối với các gói, bạn có thể muốn sử dụng [[[NSBundle bundleWithPath: pref] localizedInfoDipedia] objectForKey: @ "CFBundleName"]. displayNameAtPath bao gồm phần mở rộng nơi mã này trả về tên được bản địa hóa.
Peter N Lewis

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

3

Có nguy cơ bị trễ nhiều năm và lạc đề - và mặc dù hiểu biết tuyệt vời của @ Marc, trong Swift có vẻ như:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.