2011-12-08 13 views
43

ユーザーのApplication SupportフォルダのNSStringを取得しようとしています。プログラムでアプリケーションサポートフォルダへのパスを取得する

私はNSString *path = @"~/Library/Application Support";を行うことができますが、これは非常にエレガントではないようです。私はNSSearchPathForDirectoriesInDomainsを使って遊んだことがありますが、それはかなり長いと思われ、いくつかの不要なオブジェクトを作成します(少なくとも、私の実装はそうします)。

これを行う簡単な方法はありますか?

+0

それは実際の '〜/ライブラリ/ Application Support /' ... – Eimantas

+0

はなぜ、これはiPhone、アプリ、およびIOSがタグ付けされていますか? –

+0

@Eimantas:はい、修正されたOPです。 –

答えて

63

NSSearchPathForDirectoriesInDomainsNSApplicationSupportDirectoryを使用することをお勧めします。

例:

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

のNSLog出力:

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

それは私が持っていたものよりもきれいに見えます。ありがとうございました。 –

+1

迅速な対応のためには好ましい方法ではありません。 docsから: 'FileManagerのメソッドurls(for:in :)とurl(for:appropriateFor:create :)の使用を検討する必要があります。 URLを返します。これは推奨される形式です。' – surfrider

0

これは私がデータベースを取得するために使用するものです。スタンフォードクラスからそれを手に入れました。それは誰かを助けるかもしれない。

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

NSDocumentDirectoryは、アプリケーションサポートディレクトリではなく、Documentsディレクトリを返します。 – Lupi

+0

NSDocumentDirectoryの代わりにNSApplicationSupportDirectoryを使用します。 –

6

だけの人がこれを行うための推奨される方法を使用して開始します確認するために:ドキュメントから

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

拡張例:

- (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; 
} 

証明リンク:https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW3

+0

最終ディレクトリのCFBundleExecutable名を大部分使用しますが、バンドルIDの使用をアドバイスするのは正しいでしょうよりユニーク。しかし、実行可能ファイルまたはバンドルIDを将来変更して、データへのアクセスを維持できるようにする必要があります。 – malhal

23

スウィフト4:

print(NSHomeDirectory()) 

または

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

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

これが私の作品:

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

読み、ドキュメントディレクトリへの書き込みのための独立した客観的Cクラスを作成します。私はコードの書き直しを避ける。以下は私のバージョンです。

//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

スウィフト3:

FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first 
関連する問題