Ionic 2 Native File:递归创建目录

Ionic 2 Native File: Create directory recursively

我正在使用 Ionic 2 Cordova 插件文件将一些文件保存在 Ionic Hybrid 应用程序中。我想将它们存储在目录中,如果不存在,我会尝试创建:

this.file.createDir(this.getPathWithoutLast(absolutePath), this.getLastPathString(absolutePath), true);

我的绝对路径是这样的:

file:///data/user/0/io.ionic.starter/files/dir1/dir2/dir3/dir4

我收到错误 {"code":1,"message":"NOT_FOUND_ERR"}。

经过测试,我认为该方法不能递归创建目录,所以我自己实现了一个接一个创建目录的方法。

不过,这似乎是更多人需要的东西,所以我想问一下插件中是否真的没有这个选项,如果没有,是否有我没有想到的原因。

感谢大家的宝贵时间! 帕沃尔

是的,我遇到了同样的问题,所以结束了编写自己的函数来处理这个问题。

没有测试这个,因为我找不到原来的那个,但它应该是这样的

createRecursivePath(path: string | Array<string>): Promise<string> {

    if (typeof path === 'string') {
        path = path.split('/');
        return this.createRecursivePath(path);
    }

    if (!Array.isArray(path)) {
        return Promise.reject('Error on data entry');
    }
    let promiseArray: Array<Promise<DirectoryEntry>> = path.map((dirName, index, array) => {
        let createdDirPath = array.slice(0, index);
        return this.file.checkDir([this.getDefaultAppPath(), ...createdDirPath].join('/'), dirName)
            .then()
            .catch(() => this.file.createDir([this.getDefaultAppPath(), ...createdDirPath].join('/'), dirName,false));
    });

    return Promise.all(promiseArray)
        .then(() => Promise.resolve(Array.isArray(path) && path.join('/') || ''));
}

我也会post我的解决方案,以防万一:

    public async makeSureDirectoryExists(relDirPath: string): Promise<boolean> {
        console.log(`making sure rel Path: ${relDirPath}`);
        const absolutePath = this.file.dataDirectory + relDirPath;
        console.log(`making sure abs Path: ${absolutePath}`);
        const pathParts = relDirPath.split('/');

        const doesWholePathExist: boolean = await this.doesExist(absolutePath);
        if (doesWholePathExist) {
            return true;
        }
        let currentPath = this.file.dataDirectory;
        while (pathParts.length > 0) {
            const currentDir = pathParts.shift();
            const doesExist: boolean = await this.doesExist(currentPath + currentDir);
            if (!doesExist) {
                console.log(`creating: currentPath: ${currentPath} currentDir: ${currentDir}`);
                const dirEntry: DirectoryEntry = await this.file.createDir(currentPath, currentDir, false);
                if (!dirEntry) {
                    console.error('not created!');
                    return false;
                }
            }
            currentPath = currentPath + currentDir + '/';
        }
        return true;
    }