2013-05-01 46 views
54

tôi cần phải viết tập tin vào đường dẫn sau:Cách ghi tệp nếu thư mục gốc không tồn tại?

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

}); 

Nhưng '/folder1/folder2' con đường có thể không tồn tại. Vì vậy, tôi nhận được lỗi sau:

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

Làm cách nào để viết nội dung cho đường dẫn đó?

Trả lời

80

Sử dụng mkdirp kết hợp với path.dirname trước tiên.

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); 
    }); 
} 

Nếu toàn bộ đường dẫn đã tồn tại, mkdirp là một nút. Nếu không, nó sẽ tạo ra tất cả các thư mục bị thiếu cho bạn.

Mô-đun này thực hiện những gì bạn muốn: https://npmjs.org/package/writefile. Có nó khi googling cho "writefile mkdirp". Mô-đun này trả về một lời hứa thay vì nhận một cuộc gọi lại, vì vậy hãy chắc chắn đọc một số lời giới thiệu về lời hứa đầu tiên. Nó thực sự có thể làm phức tạp mọi thứ cho bạn.

Hàm tôi đã cung cấp tác phẩm trong mọi trường hợp.

+0

Vì vậy, nếu chúng ta muốn chờ đợi để hoàn thành, chúng ta phải đặt mọi thứ sau khi nó vào cuộc gọi lại? Có cách nào khác không? – pete

+0

@pete nếu bạn sử dụng babel, bạn có thể đi với async/await như gist này: https://gist.github.com/lucasreppewelander/9c87115b28cbd5d556e22b500deb555c –

4

Bạn có thể sử dụng

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

stats là một loại fs.Stats của đối tượng, bạn có thể kiểm tra stats.isDirectory(). Tùy thuộc vào việc kiểm tra errstats bạn có thể làm điều gì đó, fs.mkdir(...) hoặc ném một lỗi.

Reference

Cập nhật: Cố định các dấu phẩy trong các mã.

+0

Vì vậy, tôi không thể ghi tệp bằng cách sử dụng lệnh sibgle trong nútjs? – Erik

13

Có lẽ đơn giản nhất, bạn chỉ có thể sử dụng mô-đun fs-path npm.

Mã của bạn sau đó sẽ như thế nào:

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

Dưới đây là một phần của câu trả lời Myrne Stol của nổ ra như một câu trả lời riêng biệt:

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

Dưới đây là chức năng tùy chỉnh của tôi để đệ quy tạo thư mục (không có bên ngoài phụ thuộc):

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

Tạo thư mục đệ quy nếu chúng không tồn tại! (Zero, phụ thuộc)

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!

  • Giải pháp này xử lý cả hai tươngtuyệt đối đường
  • Trong trường hợp của đường dẫn tương đối, thư mục mục tiêu sẽ được tạo ra (giải quyết) trong thư mục làm việc hiện tại. Để giải quyết chúng vào thư mục tập lệnh hiện tại, hãy sử dụng __dirname như sau: path.resolve(__dirname, parentDir, childDir);.
  • Sử dụng path.seppath.resolve(), không chỉ / nối, để tránh các vấn đề đa nền tảng.
6

tôi thấy rằng cách dễ nhất để làm điều này là sử dụng phương pháp outputFile() từ các mô-đun fs-extra.

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().

Ví dụ:

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! 
    }); 
}); 

Nó cũng có hỗ trợ hứa hẹn ra khỏi hộp những ngày này !.

Các vấn đề liên quan