/** 迁移已下载的文件 */
#warning 关于游客状态下下载的内容,需要考虑两部分:
1. 登录的正式用户之前未在本机上登录过,创建用户的下载路径后直接将游客的下载内容全部迁移过去(若只是登录过没有下载内容,就直接全部迁移过去);
2. 登录的正式有用户之前在本机登录过并有下载内容,则需要将两个路径下的下载内容合并
- (void)transferDownLoadedFile {
// 获取下载文件根路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDir = [paths objectAtIndex:0];
NSString *rootFilePath = [NSString stringWithFormat:@"%@/%@",libraryDir,@"## 这里是项目中下载文件的路径 ##"];
// 分别获取游客和正式用户的下载路径(方便起见直接使用对应ID作为路径名称)
NSString *guestPath = [NSString stringWithFormat:@"%@/%@", rootFilePath, self.accountManager.guestId];
NSString *userPath = [NSString stringWithFormat:@"%@/%@", rootFilePath, self.accountManager.userId];
// 获取文件管理器
NSFileManager *manager = [NSFileManager defaultManager];
// 获取游客的下载文件数组
NSError *error = nil;
NSArray *guestFilesArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:guestPath error:&error];
if (error) {
NSLog(@"contentsOfDirectoryAtPath guestPath:%@", error);
}
// 遍历游客的文件
for (NSString *fileName in guestFilesArr) {
// 拼接处 该文件在 游客状态 && 正式用户状态 的存储路径
NSString *guestFileDir = [guestPath stringByAppendingPathComponent:fileName];
NSString *userFileDir = [userPath stringByAppendingPathComponent:fileName];
// 如果正式用户 下载文件中不包含该文件,就创建一下
if (![manager fileExistsAtPath:userFileDir]) {
[manager createDirectoryAtPath:userFileDir withIntermediateDirectories:YES attributes:nil error:&error];
}
BOOL isDir;
if ([manager fileExistsAtPath:guestFileDir isDirectory:&isDir] && isDir) {
error = nil;
NSArray *childFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:guestFileDir error:&error];
if (error) {
NSLog(@"contentsOfDirectoryAtPath dir:%@", error);
}
// 遍历该文件夹内子文件,全部迁移到 正式用户 名下的文件
for (NSString *childFile in childFiles) {
NSString *filePath = [guestFileDir stringByAppendingPathComponent:childFile];
NSString *destPath = [userFileDir stringByAppendingPathComponent:childFile];
error = nil;
[manager moveItemAtPath:filePath toPath:userFileDir error:&error];
if (error) {
DDLogError(@"moveItemAtPath to path error:%@", error);
//如果正式用户下该文件存在(即用户之前在本机登录并下载过该文件)会报错,那么就将游客路径下的改文件删除
[manager removeItemAtPath:filePath error:&error];
}
}
}
}
}
来源: https://juejin.im/post/5a31e6fef265da431e16c676