Câu hỏi Viết tệp trong Node.js


Tôi đã cố gắng tìm một cách để viết vào một tập tin khi sử dụng Node.js, nhưng không thành công. Làm thế nào tôi có thể làm điều đó?


1147
2018-03-23 00:25


gốc




Các câu trả lời:


Có rất nhiều chi tiết trong API hệ thống tệp. Cách phổ biến nhất (theo như tôi biết) là:

var fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 

1813
2018-03-23 01:50



Tôi đã thử nghiệm kịch bản này bằng cách sử dụng Node và tôi đã thử thay đổi đường dẫn tệp thành "/ home /", nhưng tôi đã gặp lỗi sau: { [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }  Làm thế nào tôi có thể sửa đổi kịch bản này để nó sẽ hoạt động bên ngoài /tmp? - Anderson Green
Cũng lưu ý rằng bạn có thể sử dụng fs.writeFileSync (...) để thực hiện cùng một điều đồng bộ. - David Erwin
Có lẽ nó hơi cũ, nhưng @AndersonGreen, bạn cần phải chạy nút như root hoặc chmod / home đúng cách để cho phép quyền R / W cho chủ sở hữu quá trình nút hiện tại (tên người dùng của bạn khó khăn) để bạn có thể ghi tệp - Denys Vitali
Trên thực tế, @DenysVitali, vấn đề là jane không nên viết bất kỳ tệp nào vào /home/.... Nói chung thư mục đó là 755 root: wheel (hoặc bất kỳ thứ gì). Nếu nút muốn viết một tập tin như jane, nó sẽ dễ viết hơn /home/jane/test.txt. Thay đổi /home một cái gì đó dễ dãi hơn 755 là một sai lầm lớn. - jane arc
@ JaneAvriette Vâng, vì anh ấy muốn lưu tệp trên /home thư mục tôi đề nghị để chmod nó. Tôi biết nó có thể tạo ra một vấn đề an ninh. Nhưng tốt, nếu người dùng muốn lưu ở đó, đó là giải pháp. Tái bút: Tôi đồng ý với những gì bạn đã nói (: - Denys Vitali


Hiện tại có ba cách để viết một tệp:

  1. fs.write(fd, buffer, offset, length, position, callback)

    Bạn cần phải đợi cuộc gọi lại để đảm bảo rằng bộ đệm được ghi vào đĩa. Nó không được đệm.

  2. fs.writeFile(filename, data, [encoding], callback)

    Tất cả dữ liệu phải được lưu trữ cùng một lúc; bạn không thể thực hiện ghi tuần tự.

  3. fs.createWriteStream(path, [options])

    Tạo một WriteStream, điều này thuận tiện vì bạn không cần chờ một cuộc gọi lại. Nhưng một lần nữa, nó không được đệm.

A WriteStream, như tên gọi, là một luồng. Một luồng theo định nghĩa là "một bộ đệm" chứa dữ liệu di chuyển theo một hướng (đích nguồn ►). Nhưng một luồng có thể ghi được không nhất thiết phải "đệm". Một luồng được "đệm" khi bạn viết n lần và vào thời điểm n+1, luồng sẽ gửi bộ đệm tới hạt nhân (vì nó đầy và cần được xóa).

Nói cách khác: "Một bộ đệm" là đối tượng. Có hay không nó "được đệm" là một tài sản của đối tượng đó.

Nếu bạn nhìn vào mã, WriteStream kế thừa từ một ghi Stream vật. Nếu bạn chú ý, bạn sẽ thấy cách họ xóa nội dung; họ không có bất kỳ hệ thống đệm nào.

Nếu bạn viết một chuỗi, chuỗi đó sẽ được chuyển đổi thành bộ đệm và sau đó được gửi đến lớp gốc và được ghi vào đĩa. Khi viết chuỗi, chúng không làm đầy bộ đệm. Vì vậy, nếu bạn làm:

write("a")
write("b")
write("c")

Bạn đang làm:

fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))

Đó là số ba các cuộc gọi đến lớp I / O. Mặc dù bạn đang sử dụng "bộ đệm", dữ liệu không được đệm. Một luồng đệm sẽ làm: fs.write(new Buffer ("abc")), một cuộc gọi đến lớp I / O.

Hiện tại, trong Node.js v0.12 (phiên bản ổn định được công bố 02/06/2015) hiện hỗ trợ hai chức năng: cork() và uncork(). Dường như các chức năng này cuối cùng sẽ cho phép bạn đệm / xóa các cuộc gọi viết.

Ví dụ, trong Java có một số lớp cung cấp các luồng đệm (BufferedOutputStream, BufferedWriter...). Nếu bạn viết ba byte, các byte này sẽ được lưu trữ trong bộ đệm (bộ nhớ) thay vì thực hiện một cuộc gọi I / O chỉ với ba byte. Khi bộ đệm đầy, nội dung bị xóa và lưu vào đĩa. Điều này cải thiện hiệu suất.

Tôi không phát hiện ra bất cứ điều gì, chỉ cần nhớ cách thực hiện truy cập đĩa.


434
2017-08-05 15:28



1 - lời giải thích hay. Đối với luồng ghi, điều quan trọng là phải đọc kỹ tài liệu. Nếu trả về false hoặc đóng, quan trọng là hãy gọi writer.once ('drain', function () {}) hoặc tôi bỏ lỡ các dòng chưa thoát khi quá trình kết thúc. - bryanmac
bất kỳ cơ hội nào bạn có thể cung cấp một ví dụ về cách sử dụng cork() và uncork() cho những ai muốn thử nút 0.11 tiền phát hành? - professormeowingtons
Hiện tại, Node v0.12 ổn định. - aug


Tất nhiên bạn có thể làm cho nó tiên tiến hơn một chút. Không chặn, viết bit và mẩu, không ghi toàn bộ tệp cùng một lúc:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});

189
2017-12-16 14:40



Biến 'fd' được chuyển vào hàm gọi lại cho luồng.once là gì? - Scott David Tesler
@ScottDavidTesler mô tả tệp để bạn có thể đóng luồng sau khi đã thực hiện xong. - Alexey Kamenskiy
Khi nào tôi đóng luồng? Tại sao điều này không bị chặn? Chỉ cần tò mò, tôi đang cố gắng để viết vào một tập tin đăng nhập. - BigOmega
Bạn luôn có thể thực hiện stream.end () khi bạn đã thực hiện stream.writes () của mình. Tôi sẽ thêm nó vào ví dụ. - Fredrik Andersson
@ JoLiss Bạn sẽ phải chờ đợi. - Fredrik Andersson


var path = 'public/uploads/file.txt',
buffer = new Buffer("some content\n");

fs.open(path, 'w', function(err, fd) {
    if (err) {
        throw 'error opening file: ' + err;
    }

    fs.write(fd, buffer, 0, buffer.length, null, function(err) {
        if (err) throw 'error writing file: ' + err;
        fs.close(fd, function() {
            console.log('file written');
        })
    });
});

38
2017-11-07 20:54



điều này chứng tỏ làm thế nào để viết một tập tin bằng cách sử dụng các hoạt động fs cấp thấp hơn. ví dụ, bạn có thể đảm bảo khi tệp đã hoàn thành ghi vào đĩa và đã phát hành các bộ mô tả tệp. - Sean Glover


tôi thích Chỉ mục của ./articles/file-system.

Nó làm việc cho tôi.

Xem thêm Làm cách nào để ghi tệp trong node.js?.

fs = require('fs');
fs.writeFile('helloworld.txt', 'Hello World!', function (err) {
    if (err) 
        return console.log(err);
    console.log('Wrote Hello World in file helloworld.txt, just check it');
});

Nội dung của helloworld.txt:

Hello World!

Cập nhật:
Như trong Linux nút ghi trong thư mục hiện tại, có vẻ như trong một số người khác không, vì vậy tôi thêm bình luận này chỉ trong trường hợp:
Sử dụng cái này ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); để lấy nơi tệp được ghi.


20
2017-10-23 07:54



Nơi tìm tập tin helloworld.txt? Tôi không thể tìm thấy nó trong bất kỳ thư mục ... cảm ơn. - Kai Feng Chew
trong thư mục mà bạn chạy tập lệnh - Sérgio
Lạ thật ... Tôi không thể tìm thấy nó ở đâu cả. Nó sẽ được ẩn? cảm ơn một lần nữa ~ - Kai Feng Chew
nút test.js cat helloworld.txt Xin chào thế giới! - Sérgio
Tôi chỉ tìm thấy nó. Sử dụng cái này ROOT_APP_PATH = fs.realpathSync ('.'); console.log (ROOT_APP_PATH); để có được vị trí của tôi trong hồ sơ được viết. Cảm ơn. - Kai Feng Chew


 var fs = require('fs');
 fs.writeFile(path + "\\message.txt", "Hello", function(err){
 if (err) throw err;
  console.log("success");
}); 

Ví dụ: đọc tệp và ghi vào tệp khác:

  var fs = require('fs');
    var path = process.cwd();
    fs.readFile(path+"\\from.txt",function(err,data)
                {
                    if(err)
                        console.log(err)
                    else
                        {
                            fs.writeFile(path+"\\to.text",function(erro){
                                if(erro)
                                    console.log("error : "+erro);
                                else
                                    console.log("success");
                            });
                        }
                });

5
2018-05-17 05:54



Nơi bạn đang ghi dữ liệu vào "to.text" ?? - Ravi Shanker Reddy


Viết đồng bộ

fs.writeFileSync (tệp, dữ liệu [, tùy chọn])

fs = require('fs');

fs.writeFileSync("synchronous.txt", "synchronous write!")

Viết không đồng bộ

fs.writeFile (tệp, dữ liệu [, tùy chọn], gọi lại)

fs = require('fs');

fs.writeFile('asynchronous.txt', 'asynchronous write!', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

Ở đâu

file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>

Đáng đọc hệ thống tập tin chính thức (fs) tài liệu.


4
2017-10-01 05:39





Ở đây chúng ta sử dụng w + để đọc / ghi cả hai hành động và nếu đường dẫn tệp không tìm thấy nó sẽ được tạo tự động.

fs.open(path, 'w+', function(err, data) {
    if (err) {
        console.log("ERROR !! " + err);
    } else {
        fs.write(data, 'content', 0, 'content length', null, function(err) {
            if (err)
                console.log("ERROR !! " + err);
            fs.close(data, function() {
                console.log('written success');
            })
        });
    }
});

Nội dung có nghĩa là những gì bạn phải ghi vào tệp và độ dài của tệp, 'content.length'.


2
2017-09-01 11:06





Đây là mẫu làm thế nào để đọc tập tin csv từ địa phương và viết csv tập tin địa phương.

var csvjson = require('csvjson'),
    fs = require('fs'),
    mongodb = require('mongodb'),
    MongoClient = mongodb.MongoClient,
    mongoDSN = 'mongodb://localhost:27017/test',
    collection;

function uploadcsvModule(){
    var data = fs.readFileSync( '/home/limitless/Downloads/orders_sample.csv', { encoding : 'utf8'});
    var importOptions = {
        delimiter : ',', // optional 
        quote     : '"' // optional 
    },ExportOptions = {
        delimiter   : ",",
        wrap        : false
    }
    var myobj = csvjson.toSchemaObject(data, importOptions)
    var exportArr = [], importArr = [];
    myobj.forEach(d=>{
        if(d.orderId==undefined || d.orderId=='') {
            exportArr.push(d)
        } else {
            importArr.push(d)
        }
    })
    var csv = csvjson.toCSV(exportArr, ExportOptions);
    MongoClient.connect(mongoDSN, function(error, db) {
        collection = db.collection("orders")
        collection.insertMany(importArr, function(err,result){
            fs.writeFile('/home/limitless/Downloads/orders_sample1.csv', csv, { encoding : 'utf8'});
            db.close();
        });            
    })
}

uploadcsvModule()

2
2018-05-04 05:15





Bạn có thể sử dụng thư viện easy-file-manager

cài đặt trước từ npm npm install easy-file-manager

Mẫu để tải lên và xóa tệp

var filemanager = require('easy-file-manager')
var path = "/public"
var filename = "test.jpg"
var data; // buffered image

filemanager.upload(path,filename,data,function(err){
    if (err) console.log(err);
});

filemanager.remove(path,"aa,filename,function(isSuccess){
    if (err) console.log(err);
});

1
2018-05-28 00:06



This modules is created to save and remove files.. Không phải là câu trả lời. - Green