iOS沙盒路径及文件操作

2023-10-31  本文已影响0人  冷暖自知灬

前言

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

沙盒

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

Documents :

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

Library:

这个目录下有两个子目录:Caches 和 Preferences

Preferences:

包含应用程序的偏好设置文件。你不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。

Caches:

用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。iTunes或iCloud不会对其进行备份。如果存储空间过低,可能会被系统删除。

tmp:

这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。系统会不定期删除里面的文件,iTunes或iCloud也不会对其进行备份

SystemData

新加的一个文件,具体的作用未知。

AppName.app:

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

获取路径相关函数:
// 获取沙盒主目录路径
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];
}
上一篇下一篇

猜你喜欢

热点阅读