2011-12-08 28 views
43

Tôi đang cố gắng nhận một NSString cho thư mục Hỗ trợ Ứng dụng của người dùng.Lập trình có đường dẫn đến thư mục Hỗ trợ Ứng dụng

Tôi biết tôi có thể làm NSString *path = @"~/Library/Application Support"; nhưng điều này không có vẻ rất thanh lịch. Tôi đã chơi xung quanh với việc sử dụng NSSearchPathForDirectoriesInDomains nhưng nó có vẻ là khá dài gió và tạo ra một số đối tượng không cần thiết (ít nhất, thực hiện của tôi của nó không).

Có cách nào đơn giản để thực hiện việc này không?

+0

nó thực sự là '~/Library/Application Support /' ... – Eimantas

+0

tại sao điều này tagged iphone, ipad, và ios? –

+0

@Eimantas: Có, sửa lỗi OP. –

Trả lời

63

Thực tiễn tốt nhất là sử dụng NSSearchPathForDirectoriesInDomains với NSApplicationSupportDirectory là "dài có gió" vì có thể.

Ví dụ:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); 
NSString *applicationSupportDirectory = [paths firstObject]; 
NSLog(@"applicationSupportDirectory: '%@'", applicationSupportDirectory); 

NSLog đầu ra:

applicationSupportDirectory: '/Volumes/User/me/Library/Application Support' 
+0

Có vẻ sạch hơn nhiều so với những gì tôi có. Cảm ơn bạn. –

+1

Để nhanh chóng, nó không phải là phương pháp ưa thích. Từ tài liệu: 'Bạn nên cân nhắc sử dụng các url của phương thức FileManager (cho: trong :) và url (cho: in: properFor: create :). trả lại URL, là định dạng ưa thích.' – surfrider

0

Đây là những gì tôi sử dụng để có được cơ sở dữ liệu. Đã nhận nó từ lớp Stanford. Nó có thể giúp ai đó.

NSURL *url = [[[NSFileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
url = [url URLByAppendingPathComponent:@"database_name"]; 
NSLog(@"Database URL: %@",url); 
+10

NSDocumentDirectory trả về thư mục Tài liệu, không phải thư mục Hỗ trợ Ứng dụng – Lupi

+0

Chỉ cần sử dụng' NSApplicationSupportDirectory' thay vì 'NSDocumentDirectory' –

6

Chỉ cần chắc chắn mọi người sẽ bắt đầu sử dụng cách khuyến khích để làm điều này:

- (NSArray<NSURL *> * _Nonnull)URLsForDirectory:(NSSearchPathDirectory)directory 
             inDomains:(NSSearchPathDomainMask)domainMask 

mở rộng ví dụ từ tài liệu:

- (NSURL*)applicationDataDirectory { 
    NSFileManager* sharedFM = [NSFileManager defaultManager]; 
    NSArray* possibleURLs = [sharedFM URLsForDirectory:NSApplicationSupportDirectory 
           inDomains:NSUserDomainMask]; 
    NSURL* appSupportDir = nil; 
    NSURL* appDirectory = nil; 

    if ([possibleURLs count] >= 1) { 
     // Use the first directory (if multiple are returned) 
     appSupportDir = [possibleURLs objectAtIndex:0]; 
    } 

    // If a valid app support directory exists, add the 
    // app's bundle ID to it to specify the final directory. 
    if (appSupportDir) { 
     NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier]; 
     appDirectory = [appSupportDir URLByAppendingPathComponent:appBundleID]; 
    } 

    return appDirectory; 
} 

Proof liên kết: https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3

+0

Hầu hết sử dụng tên CFBundleExecutable cho thư mục cuối cùng, nhưng bạn có thể khuyên bạn sử dụng ID gói vì nó độc đáo hơn. Tuy nhiên, bạn phải cân nhắc quá nhiều thời gian, bạn có thể thay đổi tệp thực thi hoặc ID nhóm trong tương lai để bạn có thể duy trì quyền truy cập vào dữ liệu. – malhal

23

Swift 4:

print(NSHomeDirectory()) 

hoặc

print(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first) 

let yourString = String(FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first) 
1

này làm việc cho tôi:

NSError *error; 
NSURL* appSupportDir = [[NSFileManager defaultManager]  
     URLForDirectory:NSApplicationSupportDirectory 
       inDomain:NSUserDomainMask 
     appropriateForURL:nil 
        create:YES 
        error:&error]; 
0

Tạo lớp C mục tiêu riêng biệt để đọc và ghi vào thư mục tài liệu. Tôi sẽ tránh viết lại mã. Dưới đây là phiên bản của tôi.

//Directory.h 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#define PATH (NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)) 
#define BASEPATH (([PATH count] > 0)? [PATH objectAtIndex:0] : nil) 

@interface DocumentsDirectory : NSObject 

//Here you can also use URL path as return type and file path. 
+(void)removeFilesfromDocumentsDirectory:(NSString*)filename; 
+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename; 
@end 


#import "Directory.h" 

@implementation DocumentsDirectory 

UIAlertView *updateAlert; 

+(void)removeFilesfromDocumentsDirectory:(NSString*)filename 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *filePath = [BASEPATH stringByAppendingPathComponent:filename]; 

    NSError *error; 
    BOOL success = [fileManager removeItemAtPath:filePath error:&error]; //Remove or delete file from documents directory. 

    if (success) 
    { 
     updateAlert= [[UIAlertView alloc] initWithTitle:@"Congratulations:" message:@"File is updated successfully" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [updateAlert show]; 
    } 
    else 
    { 
     NSLog(@"Could not delete file -:%@ ",[error localizedDescription]); 
     updateAlert= [[UIAlertView alloc] initWithTitle:@"Try again:" message:[error localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [updateAlert show]; 
    } 
} 

+(NSString*)writeFiletoDocumentsDirectory:(NSString*)filename 
{ 
    NSString *foldDestination = BASEPATH; 
    NSString *filePath = [foldDestination stringByAppendingPathComponent:filename]; 

    return filePath; 
} 

@end 
15

Swift 3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first 
Các vấn đề liên quan