沙盒
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
// 數據持久化
// 一些不可再生的數據可以進行數據持久化,說白了就是放進APP的文件中,而可再生的數據,是放在內存中的;可以被適當
// 沙盒(SandBox),他的本質是一個文件夾,叫沙盒的原因是因為它符合一種安全機制
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor purpleColor];
// 沙盒路徑 : 每次安裝應用程序,都會產生一個沙盒,沙盒的路徑非常深,并且經過了隨機加密
// 沙盒的使用,導致APP都是自身管理自身,在沒有權限或者許可的情況下,兩個不同的APP不可以互相訪問
// 1.
// NSString *userName = NSUserName();
// NSString *sandBoxPath = NSHomeDirectoryForUser(userName);
//
// NSLog(@"%@",sandBoxPath);
// 2.
NSString *sandBoxPath = NSHomeDirectory();
NSLog(@"%@",sandBoxPath);
// 沙盒文件
/*
// 沙盒中有三個文件夾
// 1. Document 存儲用戶數據,需要備份的信息 (一般是那些被數據持久化的數據)
// 會被iTunes同步
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSLog(@"%@",documentPath);
// 2. Library/Caches 存儲緩存文件 (一般是一些圖片和視頻的緩存)
// 不會被iTunes不會被同步
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSLog(@"%@",cachesPath);
// 3. Library/Preferences 存儲應用程序的偏好設置文件
// 會被iTunes同步
NSString *preferencesPath = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, NO)[0];
// 如果把參數改成NO 沙盒路徑前面會省略用波浪線代替
NSLog(@"%@",preferencesPath);
// 4. tmp 臨時文件夾,放臨時文件,退出APP的時候,里面文件被清除
// 不會被iTunes同步
NSString *tempPath = NSTemporaryDirectory();
NSLog(@"%@",tempPath);
// 5. iOS8之前,沙盒還有一個.app的文件夾
NSString *appPath = [[NSBundle mainBundle] bundlePath];
NSLog(@"%@",appPath);
*/
簡單對象寫入文件
/*
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [NSString stringWithFormat:@"%@/張三的戰(zhàn)書.txt",documentPath];
NSString *loveContent = @"iLoveU";
// 將內容寫入文件
[loveContent writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"%@",filePath);
NSString *filePath2 = [documentPath stringByAppendingString:@"/myVideo.avi"];
NSString *aviContent = @"愛情動作片";
[aviContent writeToFile:filePath2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",filePath2);
// 新建一個文件
// 寫入一個簡單對象 NSArray NSDictionAry
NSArray *arr = [NSArray arrayWithObjects:@"da",@"fag",@"afgthfd", nil];
[arr writeToFile:filePath atomically:YES];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"a",@"2",@"b",@"3",@"c", nil];
[dict writeToFile:filePath atomically:YES];
NSLog(@"%@",filePath);
// 讀取文件中的內容
*/
NSFileManager 文件管理者
//1. 新建文件夾 2. 可以創(chuàng)建 移動 復制 刪除文件 3.判斷文件是否存在
NSFileManager *manager = [NSFileManager defaultManager];
// 1. 新建文件夾
[manager createDirectoryAtPath:[sandBoxPath stringByAppendingString:@"/我的"]withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"%@",sandBoxPath);
// 刪除
// [manager removeItemAtPath:[sandBoxPath stringByAppendingString:@"/我的"] error:nil];
// 移動
// [manager moveItemAtPath: toPath: error:;]
// 復制
// [manager copyItemAtPath: toPath: error:];
// 判斷是否存在
// - (BOOL)fileExistsAtPath:(NSString *)path;
// - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
// - (BOOL)isReadableFileAtPath:(NSString *)path;
// - (BOOL)isWritableFileAtPath:(NSString *)path;
// - (BOOL)isExecutableFileAtPath:(NSString *)path;
// - (BOOL)isDeletableFileAtPath:(NSString *)path;
}
復雜對象寫入沙盒
#import <Foundation/Foundation.h>
// 1. 遵循協(xié)議
@interface Person : NSObject<NSCoding>
@property (nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSString *gender;
@end
#import "Person.h"
@implementation Person
// 實現NSCoding的編碼和反編碼方法
// 編碼方式
- (void)encodeWithCoder:(NSCoder *)aCoder{
// 把model類里面的屬性進行編碼
[aCoder encodeObject:self.name forKey:@"p_name"];
[aCoder encodeObject:self.gender forKey:@"p_gender"];
}
// 反編碼方法
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
// 反編碼的時候的時候要找返回值接受
self.name = [aDecoder decodeObjectForKey:@"p_name"];
self.gender = [aDecoder decodeObjectForKey:@"p_gender"];
};
return self;
}
@end
#import "RootViewController.h"
#import "Person.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
// document路徑
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [documentPath stringByAppendingString:@"/小明.txt"];
// NSString *tmpStr = @"我愛臺妹";
//
// [tmpStr writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//
Person *p1 = [[Person alloc]init];
// 由于p1是復雜對象,沒有辦法直接寫入文件
// 簡單對象可以直接寫入對象的原因是因為NSString,NSArray,NSdictionary,NSNumber 這些對象他們遵循了NSCoding 協(xié)議
p1.name = @"張三";
p1.gender = @"男";
NSMutableData *data1 = [NSMutableData data];
// 歸檔工具
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data1];
[archiver encodeObject:p1 forKey:@"person"];
[archiver finishEncoding];
[data1 writeToFile:filePath atomically:YES];
NSLog(@"%@",filePath);
// 讀取 (反歸檔)
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data1];
Person *p2 = [unarchiver decodeObjectForKey:@"person"];
NSLog(@"name:%@ gender:%@",p2.name,p2.gender);
[unarchiver finishDecoding];
}