今天出了个新闻macOS 的安全漏洞,macOS High Sierra可以使用不输入密码直接输入root就能获得管理员权限登录系统,这里推荐一种解决方案《macOS 系统 Root 管理员权限漏洞解决方案》
言归正传
很简单的一个功能,把字符串写入macos的文件中,虽然功能看似简单,但是涉及到一下文件的操作需要记录并提示一下。
其实核心代码就一句 writeToFile 但是有一些细节需要注意。
macos开发中的文件夹操作与iOS中的异同
整体来说ios和macos开发差不多,对于UI层面,只需把UI换成NS就好,内部方法都类似,此例子中文件操作需要注意几个小问题
#0x01 沙盒与绝对路径
ios中只能操作沙盒路径,每个app都是独立的,然而到了macos中的路径并不是沙盒,而是操作系统的真实路径,对于这个是比较方便使用的,如可以使用NSDesktopDirectory表示的就是桌面,NSDocumentDirectory就是Document文件夹。操作第一步还是使用NSFileManager defaultManger获取操作管理实例
#0x02 创建文件夹和文件先后顺序
为了写入文件,首先要创建文件,如果直接使用createFileAtPath会直接出错,此时应该要用createDirectoryAtPath先把文件夹创建起来之后才用创建文件方法。
#0x03 URLsForDirectory的使用
这个方法是返回文件夹的所有url路径,注意所有元素是NSURL类型的,放在一个数组里面,而不是string,网上有人把它当做是string,这就出错了。注意取文件路径的时候需要使用relativePath,会把file://去掉,如果用绝对路径absolutePath会带上file://,如果用这个去创建文件夹就会出错。
#0x04 操作错误的获取
为了清晰的明白错误,减少掉坑里最好使用NSError,这样会让你减少调试出错的几率和时间。
下面是代码放送
-(void)writetofile:(NSString *)string{
NSFileManager *fm = [NSFileManager defaultManager];
//创建NSFileManager实例
//获得文件路径,第一个参数是要定位的路径 NSApplicationDirectory-获取应用程序路径,NSDocumentDirectory-获取文档路径
//第二个参数是要定义的文件系统域
NSArray *paths = [fm URLsForDirectory:NSDesktopDirectory inDomains:NSUserDomainMask];
//沙盒路径
NSURL *path = [paths objectAtIndex:0];
//要查找的文件
NSString *myFiledFolder = [path.relativePath stringByAppendingFormat:@"/xxxx"];
NSString *myFiled = [myFiledFolder stringByAppendingFormat:@"/%.0f.json",[NSDate timeIntervalSinceReferenceDate]];
//判断文件是否存在
BOOL result = [fm fileExistsAtPath:myFiled];
//如果文件不存在
if (!result) {
NSString *content = string;
//创建文件夹
[fm createDirectoryAtPath:myFiledFolder withIntermediateDirectories:YES attributes:nil error:nil];
//文件
BOOL isCreate = [fm createFileAtPath:myFiled contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
if (isCreate) {
NSLog(@"创建成功");
NSError * error;
// [string writeToFile:myFiled atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"save error:%@",error.description);
}
}
else{
NSLog(@"🌺 创建失败");
}
}
NSLog(@"OUTPUT:%@",myFiled);
}
欢迎关注公众号















网友评论