iOS文件操作

一、获取沙盒下文件目录

沙盒应用根目录:NSHomeDirectory()是应用程序目录的路径,在改文件目录下有三个文件夹:Documents、Library、temp以及一个.app包

NSString *homeDir = NSHomeDirectory();

应用程序包:存放应用程序的源文件,包括资源文件和可执行文件

[[NSBundle mainBundle] pathForResource:@"wtdb" ofType:@"sqlite"];

Documents:保存用户生成的文件、应用程序不能重新创建的文件。可被iTunes备份

// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

Library:可创建子文件夹。除Caches以外,都会被iTunes备份
/Preferences:包含应用程序的偏好设置文件
/Caches:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息,保存可以重新下载或者重新生成的数据。适合存储体积大,不需要备份的非重要数据

// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

tmp:存放临时数据,保存应用程序再次启动过程中不需要的信息。不会被iTunes备份

// 获取tmp目录路径
NSString *tmpDir =  NSTemporaryDirectory();

关于iOS Data Storage Guidelines,参考iOS Data Storage Guidelines - Apple Developer

  • Documents和Caches文件夹区别

    如果你做个记事本的app,那么用户写了东西,总要把东西存起来。那么这个文件则是用户自行生成的,就放在documents文件夹里面。
    如果需要和服务器配合,经常从服务器下载东西,展示给用户看。那么这些下载下来的东西就放在library/caches。

二、文件夹操作

创建文件夹

NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//test文件夹
documentsDir = [documentsDir stringByAppendingPathComponent:@"test"];
//是否是文件夹
BOOL isDir;
BOOL isExit = [filemanager fileExistsAtPath:documentsDir isDirectory:&isDir];
//文件夹是否存在
if (!isExit || !isDir) {
    [filemanager createDirectoryAtPath:documentsDir withIntermediateDirectories:YES attributes:nil error:nil];
}

删除文件夹

//删除Wtdb文件夹
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSString *wtdbPath = [cachesDir stringByAppendingPathComponent:@"Wtdb"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:wtdbPath]) {
    BOOL isSuccess = [fileManager removeItemAtPath:wtdbPath error:nil];
}

移动文件夹

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
NSString *moveToPath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
BOOL isSuccess = [fileManager moveItemAtPath:filePath toPath:moveToPath error:nil];
if (isSuccess) {
    NSLog(@"rename success");
}else{
    NSLog(@"rename fail");
}

重命名文件夹

//通过移动该文件对文件重命名
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
NSString *moveToPath = [documentsPath stringByAppendingPathComponent:@"rename.txt"];
BOOL isSuccess = [fileManager moveItemAtPath:filePath toPath:moveToPath error:nil];
if (isSuccess) {
    NSLog(@"rename success");
}else{
    NSLog(@"rename fail");
}

三、文件操作

复制

//bundle里的数据库文件复制到Caches/Wtdb文件夹下
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *filemanager = [NSFileManager defaultManager];
cachesDir = [cachesDir stringByAppendingPathComponent:@"Wtdb"];
BOOL isDir;//是否是文件夹
BOOL exit = [filemanager fileExistsAtPath:cachesDir isDirectory:&isDir];
//文件夹是否存在
if (!exit || !isDir) {
    [filemanager createDirectoryAtPath:cachesDir withIntermediateDirectories:YES attributes:nil error:nil];
}
//判断数据库文件是否存在
NSString *wtdbPath = [cachesDir stringByAppendingPathComponent:@"wtdb.sqlite"];
//如果文件不存在,则复制
if (![filemanager fileExistsAtPath:wtdbPath]) {
    NSString *dbBundlePath = [[NSBundle mainBundle] pathForResource:@"wtdb" ofType:@"sqlite"];
    BOOL isSuccess = [filemanager copyItemAtPath:dbBundlePath toPath:wtdbPath error:nil];
    DLog(@"数据库文件%@", isSuccess ? @"拷贝成功" : @"拷贝失败");
}
  • 删除、移动、重命名与文件夹操作类似,path为文件路径。

写数据到文件

NSString *documentsPath =[self dirDoc];  
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(@"文件写入失败");  
}

读文件数据

NSString *documentsPath =[self dirDoc];  
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];  
//NSData *data = [NSData dataWithContentsOfFile:testPath];  
//NSLog(@"文件读取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);  
NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];  
NSLog(@"文件读取成功: %@",content);  

文件属性

NSString *documentsPath =[self dirDoc];  
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
NSFileManager *fileManager = [NSFileManager defaultManager];  
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];  
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:testPath error:nil];     
NSArray *keys;  
id key, value;  
keys = [fileAttributes allKeys];  
int count = [keys count];  
for (int i = 0; i < count; i++)  
{  
    key = [keys objectAtIndex: i];  
    value = [fileAttributes objectForKey: key];  
    NSLog (@"Key: %@ for value: %@", key, value);  
} 

参考:

  1. http://www.cnblogs.com/iOS-mt/p/4185407.html
  2. http://www.superqq.com/blog/2015/07/24/nsfilemanagerwen-jian-cao-zuo-de-shi-ge-xiao-gong-neng/
  3. http://www.itdadao.com/articles/c15a663369p0.html

你可能感兴趣的:(iOS文件操作)