iOS 沙盒路径及文件操作

前言

开发中经常用到获取文件路径以及文件的操作,今天就来讨论一下路径和文件相关的东西。

沙盒

沙盒是苹果的安全机制,每个应用的数据都只能存到自己对应的沙盒中,应用不能访问别的应用的沙盒。沙盒中包含documentstmpappLibrary

  • Documents :你应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

  • AppName.app:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

  • Library:这个目录下有两个子目录:CachesPreferences

    • Preferences:包含应用程序的偏好设置文件。你不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。
    • Caches:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
  • tmp:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

获取路径相关函数:


// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
    
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
// 获取tmp目录路径
NSString *tmpDir = NSTemporaryDirectory();
    
// 获取当前程序包中一个图片资源(image.png)路径
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];

文件操作

文件操作相关函数:


-(NSData *)contentsAtPath:path  //从一个文件读取数据
-(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据
-(BOOL)removeItemAtPath:path error:err  //删除一个文件
-(BOOL)moveItemAtPath:from toPath:to error:err  //重命名或者移动一个文件(to不能是已存在的)
-(BOOL)copyItemAtPath:from toPath:to error:err  //复制文件(to不能是已存在的)
-(BOOL)contentsEqualAtPath:path andPath:path2  //比较两个文件的内容
-(BOOL)fileExistAtPath:path  //判断文件是否存在
-(BOOL)isReadableFileAtPath:path  //判断文件是否存在,并且是否能执行读操作
-(BOOL)isWriteableFileAtPath:path  //判断文件是否存在,并且是否能执行写操作
-(NSDictionary *)attributesOfItemAtPath:path error:err  //获取文件的属性
-(BOOL)setAttributesOfItemAtPath:attr error:err  //更改文件的属性

/**使用目录**/
-(NSString *)currentDirectoryPath  //获取当前目录
-(BOOL)changeCurrentDirectoryPath:path  //更改当前目录
-(BOOL)copyItemAtPath:from toPath:to error:err  //复制目录结构(to不能是已存在的)
-(BOOL)createDirectoryAtPath:path withIntermediateDirectories:(BOOL)flag attribute:attr  //创建一个新目录
-(BOOL)fileExistAtPath:path isDirectory:(BOOL*)flag  //测试文件是不是目录(flag中储存结果YES/NO)
-(NSArray *)contentsOfDirectoryAtPath:path error:err  //列出目录内容
-(NSDirectoryEnumerator *)enumeratorAtPath:path  //枚举目录的内容
-(BOOL)removeItemAtPath:path error:err  //删除空目录
-(BOOL)moveItemAtPath:from toPath:to error:err   //重命名或移动一个目录(to不能是已存在的)

/**常用路径工具方法**/
+(NSString *)pathWithComponens:components  //根据components中的元素构造有效路径
-(NSArray *)pathComponents  //析构路径,获得组成此路径的各个部分
-(NSString *)lastPathComponent  //提取路径的最后一个组成部分
-(NSString *)pathExtension  //从路径的最后一个组成部分中提取其扩展名
-(NSString *)stringByAppendingPathComponent:path  //将path添加到现有路径的末尾
-(NSString *)stringByAppendingPathExtension:ext  //将指定的扩展名添加到路径的最后一个组成部分
-(NSString *)stringByDeletingLastPathComponent  //删除路径的最后一个组成部分
-(NSString *)stringByDeletingPathExtension  //从文件的最后一部分删除扩展名
-(NSString *)stringByExpandingTileInPath   //将路径中代字符扩展成用户主目录(~)或指定用户的主目录(~user)
-(NSString *)stringByresolvingSymlinksInPath  //尝试解析路径中的符号链接
-(NSString *)stringByStandardizingPath  //通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径

创建文件夹


//创建文件夹
- (void)createDir{
    
    NSString      *documentsPath    = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSFileManager *fileManager      = [NSFileManager defaultManager];
    NSString      *testDirectory    = [documentsPath stringByAppendingPathComponent:@"test"];
    // 创建目录
    BOOL res=[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
    if (res) {
        NSLog(@"文件夹创建成功");
    }else{
        NSLog(@"文件夹创建失败");
    }
}

创建文件


//创建文件
- (void)createFile{
    NSString      *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString      *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSFileManager *fileManager   = [NSFileManager defaultManager];
    NSString      *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    
    BOOL res = [fileManager createFileAtPath:testPath contents:nil attributes:nil];
    if (res) {
        NSLog(@"文件创建成功: %@" ,testPath);
    }else{
        NSLog(@"文件创建失败");
    }
    
}

写数据到文件


//写文件
- (void)writeFile{
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSString *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    NSString *content       = @"测试写入内容!";
    BOOL res = [content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if (res) {
        NSLog(@"文件写入成功");
    }else{
        NSLog(@"文件写入失败");
    }
    
}

读取文件数据


//读文件
- (void)readFile{
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSString *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    NSString *content       = [NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"文件读取成功: %@",content);
}

删除文件


//删除文件
- (void)deleteFile{
    NSString    *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString    *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString         *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    BOOL res=[fileManager removeItemAtPath:testPath error:nil];
    if (res) {
        NSLog(@"文件删除成功");
    }else{
        NSLog(@"文件删除失败");
    }
    NSLog(@"文件是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO");
}

获取某个路径下所有文件名


- (void)getAllName{
    NSString      *documentsPath    = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSFileManager *fileManager      = [NSFileManager defaultManager];
    NSString      *testDirectory    = [documentsPath stringByAppendingPathComponent:@"test"];
    //取得一个目录下得所有文件名
    NSArray *files = [fileManager subpathsAtPath:testDirectory];
}

总结

以上就是沙盒及文件操作的相关总结

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

推荐阅读更多精彩内容