bithulu's blog

Posted Wed, 13 Sep 2017

iOS和Android应用可写目录小结

移动应用一般会用到三种可写目录:

  1. 会被系统自动备份
  2. 文件稳定保存,但是不会自动备份
  3. 缓存,特定被清掉

iOS:

应用沙盒目录:

目录获取方法参考下面代码:

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):

目录获取方法参考下面代码:

    @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");
        }
    }

参考:

Category: 开发
Tags: iOS android