一、获取沙盒下文件目录
沙盒应用根目录: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);
}
参考: