如何使用node.js确保所有目录在fs.writeFile之前都存在

问题描述 投票:0回答:4

我想知道在写入新文件之前确保路径中的所有文件夹都存在的正确方法是什么。

在以下示例中,代码失败,因为文件夹

cache
不存在。

    fs.writeFile(__config.path.base + '.tmp/cache/shared.cache', new Date().getTime(), function(err) {
        if (err){
            consoleDev('Unable to write the new cache timestamp in ' + __filename + ' at ' + __line, 'error');
        }else{
            consoleDev('Cache process done!');
        }

        callback ? callback() : '';
    });

解决方案:

    // Ensure the path exists with mkdirp, if it doesn't, create all missing folders.
    mkdirp(path.resolve(__config.path.base, path.dirname(__config.cache.lastCacheTimestampFile)), function(err){
        if (err){
            consoleDev('Unable to create the directories "' + __config.path.base + '" in' + __filename + ' at ' + __line + '\n' + err.message, 'error');
        }else{
            fs.writeFile(__config.path.base + filename, new Date().getTime(), function(err) {
                if (err){
                    consoleDev('Unable to write the new cache timestamp in ' + __filename + ' at ' + __line + '\n' + err.message, 'error');
                }else{
                    consoleDev('Cache process done!');
                }

                callback ? callback() : '';
            });
        }
    });

谢谢!

node.js fs
4个回答
5
投票

fs-extra 有一个我发现对此很有用的函数。

代码类似于:

var fs = require('fs-extra');

fs.ensureFile(path, function(err) {
  if (!err) {
    fs.writeFile(path, ...);
  }
});

4
投票

使用mkdirp

如果你真的想自己做(递归):

var pathToFile = 'the/file/sits/in/this/dir/myfile.txt';

pathToFile.split('/').slice(0,-1).reduce(function(prev, curr, i) {
  if(fs.existsSync(prev) === false) { 
    fs.mkdirSync(prev); 
  }
  return prev + '/' + curr;
});

您需要切片来省略文件本身。


2
投票

您可以使用 fs.existsSync 检查您的目录是否存在,如果不存在则创建它:

if (fs.existsSync(pathToFolder)===false) {
    fs.mkdirSync(pathToFolder,0777);
}

0
投票

从节点 10 开始,您可以通过将

options.recursive
设置为 true,使用单个命令创建整个路径:

if (!fs.existsSync(folder)) {
    fs.mkdirSync(folder, { recursive: true });
}

https://nodejs.org/api/fs.html#fsmkdirsyncpath-options

© www.soinside.com 2019 - 2024. All rights reserved.