2013-10-16 13 views
5

Tôi có một số mã cũ tìm các thư mục cụ thể bằng cách sử dụng thường lệ FSFindFolder cũ. Bây giờ tôi có nhiệm vụ hiện đại hóa mã này. Lúc đầu, sử dụng NSFileManager URLForDirectory có vẻ như là lựa chọn đúng đắn. Rất tiếc, tôi phát hiện ra rằng nhiều thư mục bạn có thể định vị bằng cách sử dụng FSFindFolder không còn được hỗ trợ bởi URLForDirectory.Định vị thư mục Mac OS X bằng cách sử dụng URLForDirectory thay vì FSFindFolder

Danh sách các thư mục bạn có thể định vị bằng cách sử dụng FSFindFolder rất dài và hầu hết chúng không hữu ích cho tôi.

Đây là một phần danh sách các FSFindFolder hằng mà tôi cần phải chuyển đổi và họ URLForDirectory tương đương:

FSFindFolder     URLForDirectory 
============================== =============== 
kDesktopFolderType    NSDesktopDirectory 
kCachedDataFolderType   NSCachesDirectory 
kApplicationSupportFolderType NSApplicationSupportDirectory 
kTemporaryFolderType   located by calling NSTemporaryDirectory() 
kCurrentUserFolderType   located by calling NSHomeDirectory() 
kSystemFolderType    Not Available 
kPreferencesFolderType   Not Available 
kTrashFolderType    Not Available 
kAudioComponentsFolderType  Not Available 
kVolumeRootFolderType   Not Available 
kSharedUserDataFolderTypeNo  Not Available 

Câu hỏi của tôi: là có một cách tiêu chuẩn để xác định vị trí đường dẫn cho mỗi thư mục được đánh dấu "Không khả dụng" mà không sử dụng FSFindFolder?

+0

Theo liên kết này http://stackoverflow.com/questions/18683345/cycle-through-a-directory-and-get-paths-of-all-the-files-and-folders/18688333#18688333 –

+0

@hussain -shabbir Câu hỏi 18683345 là về việc đi qua các tệp trong một thư mục - Nó không liên quan gì đến câu hỏi của tôi. Câu hỏi của tôi là về việc định vị các thư mục cụ thể. –

+0

Bạn có thể giải thích thêm một chút về những gì bạn muốn đạt được không. Tôi có nghĩa là những gì đầu ra bạn yêu cầu? –

Trả lời

1

Tôi sẽ tắt số legacy documentation cho các định nghĩa của hằng số FSFindFolder. Tôi sẽ cố hết sức để có thể đoán được cách họ lập bản đồ, vì vậy nếu tôi sai, vui lòng làm rõ và tôi sẽ cập nhật câu trả lời của mình.

[NSFilemanager URLForDirectory:inDomain:appropriateForURL:create:error:] (documentation) có thể giúp bạn tìm thấy một số mục này. Nó có thể tìm thấy:

NSApplicationDirectory 
NSDemoApplicationDirectory 
NSDeveloperApplicationDirectory 
NSAdminApplicationDirectory 
NSLibraryDirectory 
NSDeveloperDirectory 
NSUserDirectory 
NSDocumentationDirectory 
NSDocumentDirectory 
NSCoreServiceDirectory 
NSAutosavedInformationDirectory 
NSDesktopDirectory 
NSCachesDirectory 
NSApplicationSupportDirectory 
NSDownloadsDirectory 
NSInputMethodsDirectory 
NSMoviesDirectory 
NSMusicDirectory 
NSPicturesDirectory 
NSPrinterDescriptionDirectory 
NSSharedPublicDirectory 
NSPreferencePanesDirectory 
NSApplicationScriptsDirectory 
NSItemReplacementDirectory 
NSAllApplicationsDirectory 
NSAllLibrariesDirectory 
NSTrashDirectory 

Trong miền người dùng, cục bộ, mạng và hệ thống.

Điều đó sẽ xử lý kTrashFolderType.

Theo như tôi có thể biết, kSystemFolderType sẽ luôn là thư mục System trong thư mục gốc (ví dụ: /System) để bạn không phải tìm kiếm. kPreferencesFolderType chỉ định thư mục Tùy chọn trong Thư mục Hệ thống. Tôi không chắc chắn điều này có nghĩa là, vì không có thư mục "tùy chọn" trong số /System/Library tuy nhiên, một thư mục ở số /Library/Preferences. Đây cũng là một vị trí tĩnh.

Không chắc chắn về kAudioComponentsFolderType, kVolumeRootFolderTypekSharedUserDataFolderTypeNo ngoài tầm tay.

3

Tôi khuyên bạn nên mã hiện đại hóa, trong hầu hết các trường hợp, có nghĩa là chuyển từ bất kỳ nội dung nào bạn đang sử dụng các vị trí thư mục này thành địa điểm đầu tiên. Ví dụ: không có nhiều sử dụng hợp pháp cho tương đương với kSystemFolderType trong mã hiện đại. Bạn nên kiểm tra từng trường hợp bạn đang sử dụng chúng và hỏi giải pháp đúng là giải quyết vấn đề cấp cao mà việc triển khai cũ đã được giải quyết.

Nếu bạn thực sự cần đường dẫn đến một số thư mục này, đặt cược tốt nhất của bạn là xem đường dẫn FSFindFolder() cung cấp cho bạn xem số NSSearchPathDirectory giúp bạn gần nhất và sau đó viết mã của bạn để lấy mã đó từ URLForDirectory:... và nối thêm sự khác biệt như một đường dẫn tương đối tĩnh.

Một số khuyến nghị cụ thể:

kPreferencesFolderType: sử dụng NSUserDefaults sở thích cửa hàng; lưu trữ không mặc định trong Hỗ trợ ứng dụng

kTrashFolderType: sử dụng -[NSWorkspace recycleURLs:completionHandler:] hoặc -performFileOperation:source:destination:files:tag: với NSWorkspaceRecycleOperation; chỉ khi nào cần thiết, sử dụng -[NSFileManager URLForDirectory:...] với NSTrashDirectory

kVolumeRootFolderType: nếu bạn đang sử dụng điều này với một ref khối lượng cụ thể chứ không phải là một tên miền, sử dụng -[NSURL getResourceValue:forKey:error:] với phím NSURLVolumeURLKey

kSharedUserDataFolderType: -URLForDirectory:... với NSUserDirectory và sau đó nối @"Shared" như một thành phần đường dẫn

kAudioComponentsFolderType: Trình quản lý thành phần không còn được dùng nữa; Apple says không có thay thế chính xác, nhưng đối với một số mục đích Audio Component Services là thích hợp.

+1

"Apple nói ..." không đủ tốt cho tôi nữa. Tôi cần các vị trí thư mục chuẩn để được nhất quán. Di chuyển ra khỏi vị trí thư mục trước đó cũng có nghĩa là chuyển từ khả năng tương thích ngược cho người dùng của tôi. Tôi có người dùng trong 15 năm qua hoặc hơn đã lưu các tùy chọn của họ vào thư mục tại ~/Library/Preferences. Gần đây Apple có một giai điệu mới, trong đó thư mục Preferences không được truy cập trực tiếp. OTOH Tôi sợ FSFindFolder sẽ không được hỗ trợ trong các hệ thống trong tương lai và vì vậy muốn sử dụng mã Cocoa hiện đại. –

Các vấn đề liên quan