2013-05-01 38 views
54

我需要寫文件到以下路徑:如果父文件夾不存在,如何寫文件?

fs.writeFile('/folder1/folder2/file.txt', 'content', function() { 

}); 

'/folder1/folder2'路徑可能不存在。所以我得到以下錯誤:

message=ENOENT, open /folder1/folder2/file.txt 

如何將內容寫入該路徑?

回答

80

首先使用mkdirp結合path.dirname

var mkdirp = require('mkdirp'); 
var fs = require('fs'); 
var getDirName = require('path').dirname; 

function writeFile(path, contents, cb) { 
    mkdirp(getDirName(path), function (err) { 
    if (err) return cb(err); 

    fs.writeFile(path, contents, cb); 
    }); 
} 

如果整個路徑已經存在,mkdirp是noop。否則,它會爲您創建所有丟失的目錄。

該模塊做你想做的:https://npmjs.org/package/writefile。當谷歌搜索「writefile mkdirp」時得到它。這個模塊返回一個承諾而不是回調,所以一定要先閱讀promise的一些介紹。這可能會讓事情變得複雜。

我給出的功能在任何情況下都是有效的。

+0

所以如果我們想等待它完成,我們必須把它之後的所有東西放到回調中?有沒有其他的方法? – pete 2017-05-28 11:59:30

+0

@pete如果你使用babel,你可以像下面這樣依照async/await的要求進行操作:https://gist.github.com/lucasreppewelander/9c87115b28cbd5d556e22b500deb555c – 2018-03-08 21:48:20

4

您可以使用

fs.stat('/folder1/folder2', function(err, stats){ ... }); 

statsfs.Stats類型的對象,你可以檢查stats.isDirectory()。根據errstats的檢查結果,您可以執行某些操作,fs.mkdir(...)或發生錯誤。

Reference

更新:修正了在代碼中的逗號。

+0

所以我不能通過在nodejs中使用sibgle命令來編寫文件? – Erik 2013-05-01 10:47:03

13

也許最簡單的,你可以使用fs-path npm模塊。

那麼你的代碼是這樣:

var fsPath = require('fs-path'); 

fsPath.writeFile('/folder1/folder2/file.txt', 'content', function(err){ 
    if(err) { 
    throw err; 
    } else { 
    console.log('wrote a file like DaVinci drew machines'); 
    } 
}); 
0

這裏的Myrne短距起降的部分答案出來,作爲一個單獨的答案:

This module does what you want: https://npmjs.org/package/writefile . Got it when googling for "writefile mkdirp". This module returns a promise instead of taking a callback, so be sure to read some introduction to promises first. It might actually complicate things for you.

0

這裏是我的自定義函數遞歸創建目錄(沒有外部依賴關係):

var fs = require('fs'); 
var path = require('path'); 

var myMkdirSync = function(dir){ 
    if (fs.existsSync(dir)){ 
     return 
    } 

    try{ 
     fs.mkdirSync(dir) 
    }catch(err){ 
     if(err.code == 'ENOENT'){ 
      myMkdirSync(path.dirname(dir)) //create parent dir 
      myMkdirSync(dir) //create dir 
     } 
    } 
} 

myMkdirSync(path.dirname(filePath)); 
var file = fs.createWriteStream(filePath); 
1

如果它們以遞歸方式創建目錄不存在! (零依賴

const fs = require('fs'); 
const path = require('path'); 
const targetDir = '/folder1/folder2'; 
const sep = path.sep; 
const initDir = path.isAbsolute(targetDir) ? sep : ''; 
targetDir.split(sep).reduce((parentDir, childDir) => { 
    const curDir = path.resolve(parentDir, childDir); 
    if (!fs.existsSync(curDir)) { 
    fs.mkdirSync(curDir); 
    } 

    return curDir; 
}, initDir); 

// Then create your file 
fs.writeFile(path.resolve(targetDir, 'file.txt'), 'content',() => {}); 

Try It!

  • 該溶液處理兩種相對絕對路徑
  • 在相對路徑的情況下,目標目錄將被創建(解析)在當前的工作目錄中。要將它們解析爲當前腳本目錄,請使用__dirname作爲以下內容:path.resolve(__dirname, parentDir, childDir);
  • 使用path.seppath.resolve(),而不僅僅是/串聯,以避免跨平臺問題。
6

我發現,要做到這一點最簡單的方法是從fs-extra模塊使用outputFile()方法。

Almost the same as writeFile (i.e. it overwrites), except that if the parent directory does not exist, it's created. options are what you'd pass to fs.writeFile().

例子:

var fs = require('fs-extra'); 
var file = '/tmp/this/path/does/not/exist/file.txt' 

fs.outputFile(file, 'hello!', function (err) { 
    console.log(err); // => null 

    fs.readFile(file, 'utf8', function (err, data) { 
     console.log(data); // => hello! 
    }); 
}); 

它也有承諾支持開箱即用的這些日子!

相關問題