Khi bạn muốn ghi vào một tệp nhật ký, tức là nối thêm dữ liệu vào cuối tệp, không bao giờ sử dụng appendFile
. appendFile
mở một xử lý tệp cho mỗi phần dữ liệu bạn thêm vào tệp của mình, sau một thời gian bạn sẽ gặp một EMFILE
lỗi đẹp .
Tôi có thể thêm rằng appendFile
không dễ sử dụng hơn a WriteStream
.
Ví dụ với appendFile
:
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
fs.appendFile("append.txt", index+ "\n", function (err) {
if (err) console.log(err);
});
});
console.log(new Date().toISOString());
Lên đến 8000 trên máy tính của tôi, bạn có thể nối dữ liệu vào tệp, sau đó bạn có được điều này:
{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
at Error (native)
errno: -4066,
code: 'EMFILE',
syscall: 'open',
path: 'C:\\mypath\\append.txt' }
Hơn nữa, appendFile
sẽ viết khi nó được kích hoạt, vì vậy nhật ký của bạn sẽ không được ghi bởi dấu thời gian. Bạn có thể kiểm tra với ví dụ, đặt 1000 thay cho 100000, thứ tự sẽ là ngẫu nhiên, tùy thuộc vào quyền truy cập vào tệp.
Nếu bạn muốn thêm vào một tệp, bạn phải sử dụng một luồng có thể ghi như thế này:
var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();
Bạn kết thúc nó khi bạn muốn. Bạn thậm chí không bắt buộc phải sử dụng stream.end()
, tùy chọn mặc định là AutoClose:true
vậy, vì vậy tệp của bạn sẽ kết thúc khi quá trình của bạn kết thúc và bạn tránh mở quá nhiều tệp.