我需要寫文件到以下路徑:如果父文件夾不存在,如何寫文件?
fs.writeFile('/folder1/folder2/file.txt', 'content', function() {
});
但'/folder1/folder2'
路徑可能不存在。所以我得到以下錯誤:
message=ENOENT, open /folder1/folder2/file.txt
如何將內容寫入該路徑?
我需要寫文件到以下路徑:如果父文件夾不存在,如何寫文件?
fs.writeFile('/folder1/folder2/file.txt', 'content', function() {
});
但'/folder1/folder2'
路徑可能不存在。所以我得到以下錯誤:
message=ENOENT, open /folder1/folder2/file.txt
如何將內容寫入該路徑?
首先使用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的一些介紹。這可能會讓事情變得複雜。
我給出的功能在任何情況下都是有效的。
也許最簡單的,你可以使用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');
}
});
這裏的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.
這裏是我的自定義函數遞歸創建目錄(沒有外部依賴關係):
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);
如果它們以遞歸方式創建目錄不存在! (零依賴)
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',() => {});
__dirname
作爲以下內容:path.resolve(__dirname, parentDir, childDir);
。path.sep
和path.resolve()
,而不僅僅是/
串聯,以避免跨平臺問題。我發現,要做到這一點最簡單的方法是從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!
});
});
它也有承諾支持開箱即用的這些日子!
所以如果我們想等待它完成,我們必須把它之後的所有東西放到回調中?有沒有其他的方法? – pete 2017-05-28 11:59:30
@pete如果你使用babel,你可以像下面這樣依照async/await的要求進行操作:https://gist.github.com/lucasreppewelander/9c87115b28cbd5d556e22b500deb555c – 2018-03-08 21:48:20