ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "Student.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// NSLog(@"%@", NSHomeDirectory());
// 程序运行会分配一个沙盒文件, 沙盒文件的文件名每次运行都会变化, 文件夹名只一次有效, 沙盒一般会保存程序的一些信息, 缓存等数据, 还可以进行病毒的测试
// 沙盒里有三个文件夹: Documents, library, tmp
// Documents文件夹: 保存用户想要的一些信息, 比如收藏的内容, 设置信息
// library文件夹: 用来保存开发人员存储的一些东西
// caches缓存文件夹: 用来对缓存信息进行存储, 清除缓存就是杀出该文件夹
// Preferences用来保存一些信息, NSUserDefaults创建的plist文件保存在这个文件里
// tmp临时文件夹: 存储临时文件
// NSBundle指的是当前工程的文件夹, 在里面和可以获取图片的信息, 应用程序会在编译的时候把文件变成只读文件, 存入到NSBundle里
// // 1. 把简单的对象存入到本地
// // 简单对象��️: NSString, NSArray...
// NSString *str = @"永恒之光, 丝袜的骑士是平原的王者, 罗多克的军士带一块大门板, 极其抗揍, 库吉特的骑兵由于骑马与砍杀的骑兵AI不好所以显得很水, 萨兰德马穆鲁克很牛逼, 能量产, 升级快, 维吉亚的骑兵升级比较快, 兵种比较平衡~";
//
// // 1. 先找到目标文件夹的路径Documents
// // 参数1: 前往指定文件夹的名, NSDocumentDirectory是Documents用的, 64行, 注意不要和63行搞混. 还可以指定缓存等文件夹
// // 参数2: 文件夹的类型, 用户类型
// // 参数3: YES是绝对路径, 能找到整个路径, NO是相对路径, 只保留了前往的文件夹的名, 前面用~代替
// NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSLog(@"%@", sandBox);
// //
// NSString *sandBoxPath = sandBox[0];
// // 把要保存的内容进行路径的拼接
// NSString *docPath = [sandBoxPath stringByAppendingString:@"/骑马与砍杀.xml"];
// // 把字符串写入本地
// // 参数1: 要写入的文件路径
// // 参数2: 是否保护正在写入的文件
// // 参数3: 编码格式
// [str writeToFile:docPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"%@", docPath);
// // 把数组对象写入到本地
// NSArray *arr = @[@"萨兰德", @"维吉亚", @"库吉特", @"罗多克", @"斯瓦迪亚", @"卡拉迪亚"];
//
// NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
// NSString *sandBoxPath = sandBox[0];
// // 路径拼接
// NSString *arrPath = [sandBoxPath stringByAppendingPathComponent:@"卡拉迪亚大陆.xml"];
// // 按照指定的文件路径, 数据写入到本地
// [arr writeToFile:arrPath atomically:YES];
// NSLog(@"%@", arrPath);
//
// // 从本地把数据读出来
// NSArray *receiveArr = [NSArray arrayWithContentsOfFile:arrPath];
// for (NSString *str in receiveArr) {
// NSLog(@"%@", str);
// }
//
// // 1. 指定文件保存的沙盒文件路径
// // 2. 拼接要保存的文件路径
// // 3. 根据路径, 把数据进行写入
// // 4. 按照文件路径, 从本地再读取数据
//
// // 写一个字典, 然后参照数组的方法, 把字典写入到本地
// // 从本地把字典读出来
// NSDictionary *dic = @{@"精灵": @"阿尔达利亚",
// @"蓝国游侠": @"射术无双",
// @"红国禁卫": @"打遍天下",
// @"绿国大军": @"斧头帮在此",
// @"黄色帝国": @"各种标枪"};
// NSArray *dicSandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
// NSString *dicSandBoxPath = dicSandBox[0];
// NSString *dicPath = [dicSandBoxPath stringByAppendingString:@"列国兵种.plist"];
// [dic writeToFile:dicPath atomically:YES];
// NSLog(@"dic: %@", dicPath);
// // 读取
// NSDictionary *recevieDic = [NSDictionary dictionaryWithContentsOfFile:dicPath];
// NSLog(@"%@", recevieDic);
// NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
// [user setObject:@"伊斯兰迪尔" forKey:@"非人精灵"];
// NSLog(@"%@", NSHomeDirectory());
// // 从本地读字符串
// NSString *str = [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError **)#>];
// // 复杂对象, 写入到本地
// Student *stu = [[Student alloc] init];
// stu.name = @"伊斯兰迪尔";
// stu.hobby = @"精灵美酒";
// stu.number = @100;
// stu.age = 33;
// // 归档操作
// // 找沙盒路径
// NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
// NSString *sandBoxPath = sandBox[0];
// NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"精灵.avi"];
// NSLog(@"%@", docPath);
// [NSKeyedArchiver archiveRootObject:stu toFile:docPath];
// // 反归档: 从本地再读出来
// Student *tempStu = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
// NSLog(@"%@, %@", tempStu.name, tempStu.number);
// 把复杂对象放到数组里进行归档和反归档的操作
// Student *stu1 = [[Student alloc] initWithName:@"紫玫" hobby:@"玫瑰" age:18 number:@126];
// Student *stu2 = [[Student alloc] initWithName:@"雪芍" hobby:@"芍药" age:17 number:@109];
// Student *stu3 = [[Student alloc] initWithName:@"玉兰" hobby:@"玉兰" age:19 number:@187];
// Student *stu4 = [[Student alloc] initWithName:@"月桂" hobby:@"雨夜" age:21 number:@137];
// NSArray *arr = @[stu1, stu2, stu3, stu4];
// // 把复杂对象保存到数组中, 然后整体进行归档和反归档的操作
// // NSArray因为本身就签署了NSCoding协议, 所以可以直接进行归档和反归档操作, 自己写的复杂类也必须签NSCoding协议实现方法, 否则就会崩溃
//
// // 1. 找路径
// NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *sandBoxPath = sandBox[0];
// // 2. 给文件拼接路径
// NSString *docPath = [sandBoxPath stringByAppendingPathComponent:@"student.plist"];
// // 3. 归档或者写入
// [NSKeyedArchiver archiveRootObject:arr toFile:docPath];
// NSLog(@"%@", docPath);
//
// // 反归档
// NSArray *tempArr = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
// for (Student *stu in tempArr) {
// NSLog(@"%@", stu.name);
// }
// 文件管理
// 1. 找到沙盒路径
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *sandBOxPath = sandBox[0];
// 创建一个文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 要拼接一个文件夹的路径
// 文件夹的名, 没有扩展名
NSString *docPath = [sandBOxPath stringByAppendingPathComponent:@"tianqin"];
// 根据路径创建一个文件夹
[manager createDirectoryAtPath:docPath withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"%@", docPath);
// 在新创建的文件夹里写入一个txt文本的字符串
NSString *str = @"天琴斩月";
NSString *newPath = [docPath stringByAppendingPathComponent:@"test.txt"];
[str writeToFile:newPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
// 删除缓存文件
NSArray *cacheBox = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheBoxPath = cacheBox[0];
// 删除文件夹,文件
BOOL result = [manager removeItemAtPath:cacheBoxPath error:nil];
if (result) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
}
Student.h
#import <Foundation/Foundation.h>
// 让复杂类写入到本地执行归档和反归档的操作, 只有类签订NSCoding的协议之后, 实现协议方法才能进行归档反归档的操作
@interface Student : NSObject<NSCoding>
@property(nonatomic, copy)NSString *name;
@property(nonatomic, copy)NSString *hobby;
@property(nonatomic, assign)NSInteger age;
@property(nonatomic, retain)NSNumber *number;
- (instancetype)initWithName:(NSString *)name hobby:(NSString *)hobby age:(NSInteger)age number:(NSNumber *)number;
@end
Student.m
#import "Student.h"
@implementation Student
- (void)encodeWithCoder:(NSCoder *)aCoder;
{
// 对数据进行编码操作
// 把需要归档的数据进行编码操作, 不需要的就不写了
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.hobby forKey:@"hobby"];
[aCoder encodeObject:self.number forKey:@"number"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
// 解码操作
// 把解码之后的值赋值给属性
self.name = [aDecoder decodeObjectForKey:@"name"];
self.hobby = [aDecoder decodeObjectForKey:@"hobby"];
self.number = [aDecoder decodeObjectForKey:@"number"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- (instancetype)initWithName:(NSString *)name hobby:(NSString *)hobby age:(NSInteger)age number:(NSNumber *)number {
self = [super init];
if (self) {
self.name = name;
self.hobby = hobby;
self.age = age;
self.number = number;
}
return self;
}
@end