OC----NSBundle和NSSearchPathForDirectoriesInDomains

这两者都是iOS里获取本机存储路径的方式,整理相关内容分为简单版本和详细版本。

1.简单版本:

官方解释

一个App创建后文件存储具体分类如上图,Bundle Container主要存储App需要的相关文件,这些文件是创建App时程序猿添加的;Data Container主要存储用户相关的文件。

NSBundle获取工程中.plist文件并读取数据

//NSBundle获取plist文件:
NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
NSURL *plistUrl = [bundleURL URLByAppendingPathComponent:@"plistFileName.plist"];
//获取NSDictionary数据
NSDictionary *myDictionary = [NSDictionary dictionaryWithContentsOfURL:plistUrl];

NSSearchPathForDirectoriesInDomains获取文件路径并创建文件

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"yourFileName.jpg"];
NSFileManager *manager = [NSFileManager defaultManager];
//创建文件
if (![manager fileExistsAtPath:path]) {
  [manager createFileAtPath:path contents:nil attributes:nil];
}

2.详细版本

相关内容都是参考官网得到的https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

2.1NSBundle

程序打包的相关资源文件会存放到.app的文件下,该文件只能读取不能写入,防止程序在打包生成后被更改。而相关路径的获取就是依靠NSBundle,实例如下:

NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
    NSLog(@"bundleURL = %@\nbundlePath = %@", bundleURL, bundlePath);

打印的Log如下:

bundleURL = file:///Users/daobao777/Library/Developer/CoreSimulator/Devices/1493BDC2-10D8-47B2-8ED0-0A64C7BE3A4C/data/Containers/Bundle/Application/B217E31F-63DE-4F68-92E1-F0F0CA738F9A/MQTTClientTest.app/
bundlePath = /Users/daobao777/Library/Developer/CoreSimulator/Devices/1493BDC2-10D8-47B2-8ED0-0A64C7BE3A4C/data/Containers/Bundle/Application/B217E31F-63DE-4F68-92E1-F0F0CA738F9A/MQTTClientTest.app

获取到路径后用stringByAppendingString:@"文件名.xxx"就可以得到文件路径,进行相关操作。

2.2NSSearchPathForDirectoriesInDomains

用户数据就是用这个方法得到路径的,该方法 NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)有三个参数。
第一个directory是设置想要获取的文件夹名称,比较常用的就是NSDocumentDirectory和NSCachesDirectory,分别是/Documents和/Library/Caches。用户数据一般都是选择保存在这两个目录下。Documents目录用来存储用户生成的内容,可以通过文件共享提供给用户,同时目录的内容会被iTunes和iCloud备份。而Caches目录用来存储不希望向用户公开的任何文件,该目录的内容不会被iTunes和iCloud备份。全部目录如下:

    NSApplicationDirectory = 1,             // supported applications (Applications)
    NSDemoApplicationDirectory,             // unsupported applications, demonstration versions (Demos)
    NSDeveloperApplicationDirectory,        // developer applications (Developer/Applications). DEPRECATED - there is no one single Developer directory.
    NSAdminApplicationDirectory,            // system and network administration applications (Administration)
    NSLibraryDirectory,                     // various documentation, support, and configuration files, resources (Library)
    NSDeveloperDirectory,                   // developer resources (Developer) DEPRECATED - there is no one single Developer directory.
    NSUserDirectory,                        // user home directories (Users)
    NSDocumentationDirectory,               // documentation (Documentation)
    NSDocumentDirectory,                    // documents (Documents)
    NSCoreServiceDirectory,                 // location of CoreServices directory (System/Library/CoreServices)
    NSAutosavedInformationDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 11,   // location of autosaved documents (Documents/Autosaved)
    NSDesktopDirectory = 12,                // location of user's desktop
    NSCachesDirectory = 13,                 // location of discardable cache files (Library/Caches)
    NSApplicationSupportDirectory = 14,     // location of application support files (plug-ins, etc) (Library/Application Support)
    NSDownloadsDirectory API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 15,              // location of the user's "Downloads" directory
    NSInputMethodsDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 16,           // input methods (Library/Input Methods)
    NSMoviesDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 17,                 // location of user's Movies directory (~/Movies)
    NSMusicDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 18,                  // location of user's Music directory (~/Music)
    NSPicturesDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 19,               // location of user's Pictures directory (~/Pictures)
    NSPrinterDescriptionDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 20,     // location of system's PPDs directory (Library/Printers/PPDs)
    NSSharedPublicDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 21,           // location of user's Public sharing directory (~/Public)
    NSPreferencePanesDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 22,        // location of the PreferencePanes directory for use with System Preferences (Library/PreferencePanes)
    NSApplicationScriptsDirectory NS_ENUM_AVAILABLE(10_8, NA) = 23,      // location of the user scripts folder for the calling application (~/Library/Application Scripts/code-signing-id)
    NSItemReplacementDirectory API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) = 99,      // For use with NSFileManager's URLForDirectory:inDomain:appropriateForURL:create:error:
    NSAllApplicationsDirectory = 100,       // all directories where applications can occur
    NSAllLibrariesDirectory = 101,          // all directories where resources can occur
    NSTrashDirectory API_AVAILABLE(macos(10.8), ios(11.0)) API_UNAVAILABLE(watchos, tvos) = 102             // location of Trash directory

第二个参数是路径的选择,有5种参数,一般用NSUserDomainMask获取用户路径,而NSAllDomainsMask是获取所有路径(目前4种)的文件,参数如下:

    NSUserDomainMask = 1,       // user's home directory --- place to install user's personal items (~)
    NSLocalDomainMask = 2,      // local to the current machine --- place to install items available to everyone on this machine (/Library)
    NSNetworkDomainMask = 4,    // publically available location in the local area network --- place to install items available on the network (/Network)
    NSSystemDomainMask = 8,     // provided by Apple, unmodifiable (/System)
    NSAllDomainsMask = 0x0ffff  // all domains: all of the above and future items

例如我要获取Caches文件夹,如果设置NSAllDomainsMask就会给出所有路径:

NSArray *s4 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSAllDomainsMask, YES);
NSLog(@"s4 = %@", s4);

输出结果:

s4 = (
    "/Users/daobao777/Library/Developer/CoreSimulator/Devices/1493BDC2-10D8-47B2-8ED0-0A64C7BE3A4C/data/Containers/Data/Application/DD8FD6BA-1A1F-4B4A-912C-5D3F5B0A1A9C/Library/Caches",
    "/Library/Caches",
    "/System/Library/Caches"
)

第三个参数是是否显示完整路径,也就是将“~”展开。

3.总结

结合官方文档和Xcode文档对NSBundle和NSSearchPathForDirectoriesInDomains进行分析,有什么不对的欢迎指出,谢谢~~ :)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 今天就本周作业的读取txt文件查找了的一些方法,如下: //读取文本内容NSError *error;NSStri...
    霏誠拜咬o阅读 604评论 0 0
  • 循环引用:http://ios.jobbole.com/82077/类别的作用功能:1.扩充现有类的功能2.对现有...
    得一切从简阅读 499评论 0 1
  • 沙盒 Plist Preference偏好设置 NSKeyedArchiver归档 / NSKeyedUnarch...
    追风者366阅读 3,340评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 各位来宾、各位朋友、女士们、先生们:大家晚上好!很高兴在这里与大家同聚,我是今晚的主持人李东润。欢迎大家来到舅舅家...
    非人哉i阅读 213评论 0 0