当前位置 : 主页 > 网络编程 > JavaScript >

nodeJS写入文件(目录报错)解决方案

来源:互联网 收集:自由互联 发布时间:2021-06-28
自己看得懂的解决方法,当路径存在多级路径的时候往往会容易报错,而不同平台处理方式貌似不相同。硬着头皮写一段。 function pwedu_fileAndDirCreate(filepath, writeData, isREwite) { let ar3 = ar
自己看得懂的解决方法,当路径存在多级路径的时候往往会容易报错,而不同平台处理方式貌似不相同。硬着头皮写一段。
function pwedu_fileAndDirCreate(filepath, writeData, isREwite) {
    let ar3 = arguments[3];// 本来想控制{flag:""}的,后面想想还是算了。
    let os = require('os');
    let path = require('path');
    let fs = require('fs');
    let systemOS = os.type();
    let filepath_dir = path.dirname(filepath);

    if (systemOS == "Windows_NT") {
        let spmRegexp = new RegExp(/\:\/|(\.\/)/g);
        if (spmRegexp.test(filepath)) {
            var dirSlipt = filepath_dir.replace(/\/|\\/g, "\\");
        } else {
            var dirSlipt = './' + filepath;
        }
        dirSlipt = path.normalize(dirSlipt);
        dirSlipt = dirSlipt.replace(/\/|\\/g, "\\");
        let sliptDIR = path.dirname(dirSlipt);
        sliptDIR = sliptDIR.split(path.sep);
        let sliptArr = [];
        for (let i = 0; i < sliptDIR.length; i++) {
            sliptArr.push(sliptDIR[i]);
            let fpPrefixer = sliptArr.join("/");
            if (fs.existsSync(fpPrefixer) == false) {
                fs.mkdirSync(fpPrefixer);
            }
        }
        if (isREwite == true) {
            fs.writeFileSync(filepath, writeData, { encoding: 'utf8', flag: 'w' }, (err) => { if (err) throw err });
        } else if (isREwite == false) {
            if (fs.existsSync(filepath) == false) {
                fs.writeFileSync(filepath, writeData, { encoding: 'utf8', flag: 'w' }, (err) => { if (err) throw err });
            }
        }

    } else {
        let spmRegexp = new RegExp(/\.\//g);
        if (spmRegexp.test(filepath) == false) {
            var filePATHs = './' + filepath;
        } else {
            var filePATHs = filepath;
        }
        let filepath_normal = path.normalize(filePATHs);
        let filepath_dir = path.dirname(filepath_normal);
        let splitDIR = filepath_dir.split(path.sep);
        console.log(splitDIR);
        let dirArr = [];
        for (let i = 0; i < splitDIR.length; i++) {
            dirArr.push(splitDIR[i]);
            let fpPrefixer = dirArr.join('/');
            if (fs.existsSync(fpPrefixer) == false) {
                fs.mkdirSync(fpPrefixer);
            }
        }
        if (isREwite == true) {
            fs.writeFileSync(filepath, writeData, { encoding: 'utf8', flag: 'w' }, (err) => { if (err) throw err });
        } else if (isREwite == false) {
            if (fs.existsSync(filepath) == false) {
                fs.writeFileSync(filepath, writeData, { encoding: 'utf8', flag: 'w' }, (err) => { if (err) throw err });
            }
        }
    }
}
// 测试
pwedu_fileAndDirCreate('test/pj/a.md', 'success!', false);
pwedu_fileAndDirCreate('./ask/tt/t/l/a11.md','# success?',false);

/*
    思路:
    1. 文件路径的 path.dirname()JSON 化。
    2. for()循环一级一级文件夹往下建。
    3. 最后写入文件。

    可能存在的问题:
    1. 跨目录写文件可能??,未测试。
    2. 带根目录(C:/....)的情形未测试。

    捷径:test/t/e/s/t.txt-----> ["test","t","e","s","t.txt"]
    可能是这样子 filepath.split("/")文件路径JSON化,直接for()循环一级一级文件夹往下建,最后写入文件。
    需要正则替换写成数组。for()循环写的时候,循环步长 
网友评论