前言
开发中经常用到获取文件路径以及文件的操作,今天就来讨论一下路径和文件相关的东西。
沙盒
沙盒是苹果的安全机制,每个应用的数据都只能存到自己对应的沙盒中,应用不能访问别的应用的沙盒。沙盒中包含documents,tmp,app,Library。
Documents :你应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
AppName.app:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
-
Library:这个目录下有两个子目录:Caches 和 Preferences
- 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];
}
总结
以上就是沙盒及文件操作的相关总结