iOS和Android应用可写目录小结
移动应用一般会用到三种可写目录:
- 会被系统自动备份
- 文件稳定保存,但是不会自动备份
- 缓存,特定被清掉
iOS:
应用沙盒目录:
- Documents iCloud备份
- Caches 随时会被系统清掉
- Applicatin Support 不会iCloud backup,也不会被系统随意清掉
目录获取方法参考下面代码:
std::string IosPlatformExt::getWritableDir(DirType dirType)
{
NSSearchPathDirectory nsdir = NSDocumentDirectory;
switch (dirType) {
case DirType::Files :
nsdir = NSDocumentDirectory;
break;
case DirType::NoBackupFiles :
//for iOS, return Applicatin Support Dir
nsdir = NSApplicationSupportDirectory;
break;
case DirType::Cache:
nsdir = NSCachesDirectory;
break;
default:
assert(0);//not supported type
break;
}
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(nsdir, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
//确保目录被创建
NSError * error = nil;
[[NSFileManager defaultManager] createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:&error];
if (error != nil) {
NSLog(@"error creating directory: %@", error);
}
return [path UTF8String];
}
Android
分内部和外部存储,这里只讨论内部存储(Internel storage):
- getFilesDir() /data/data/your-app-id/files 会被备份,跟系统版本有关。
- getNoBackupFilesDir() since API 21,类似iOS的Applicatin Support
- getCacheDir() 系统空间不足时会被清掉
目录获取方法参考下面代码:
@Keep
public static String getWritableDir(int dirType) {
switch (dirType)
{
case DIR_TYPE_FILES:
return Cocos2dxHelper.getActivity().getFilesDir().getAbsolutePath();
case DIR_TYPE_CACHE:
return Cocos2dxHelper.getActivity().getCacheDir().getAbsolutePath();
case DIR_TYPE_NO_BACKUP_FILES:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return Cocos2dxHelper.getActivity().getNoBackupFilesDir().getAbsolutePath();
} else {
return Cocos2dxHelper.getActivity().getFilesDir().getAbsolutePath();
}
default:
throw new InvalidParameterException("unknown dirType");
}
}
参考: