如何添加到节点中的文件?

我试着

添加

行到日志文件。 但 writeFile 在录制字符串之前,它将每次删除内容。


fs.writeFile/'log.txt', 'Hello Node', function /err/ {
if /err/ throw err;
console.log/'It\'s saved!'/;
}/; // => message.txt erased, contains only 'Hello Node'


有想法如何让它更容易?
已邀请:

风见雨下

赞同来自:

对于随机添加剂可以使用
appendFile

, 每次调用时都会创建新的文件句柄:

https://nodejs.org/api/fs.html ... lback
:


const fs = require/'fs'/;

fs.appendFile/'message.txt', 'data to append', function /err/ {
if /err/ throw err;
console.log/'Saved!'/;
}/;


https://nodejs.org/api/fs.html ... tions
:


const fs = require/'fs'/;

fs.appendFileSync/'message.txt', 'data to append'/;


但是如果你增加了多次到同一个文件,更好
https://coderoad.ru/3459476/
.

郭文康

赞同来自:

当您想写入日志文件时,即,将数据添加到文件的末尾,

绝不

不使用
appendFile

,
appendFile

为您添加到文件的每个数据片段打开文件描述符,之后一段时间才能获得一个漂亮的错误
EMFILE

.

我可以补充一点
appendFile

不容易使用
WriteStream

.

例子
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///;


到 8000 在我的电脑上,您可以将数据添加到文件中,然后获取:


{ 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' }


除了,
appendFile

将在启用时写入,因此不会记录您的日志 timestamp. 您可以使用示例进行检查,安装 1000 反而 100000, 订单将随机取决于访问该文件。

如果要添加文件,请您

应该

使用如下所示的录制流:


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//;


你想要的时候可以用它完成。 你甚至不必使用
stream.end//

, 默认情况下,选项
AutoClose:true

, 所以您的文件将在您的进程结束时结束,并且您将避免打开太多文件。

喜特乐

赞同来自:

你的代码 createWriteStream 为每条记录创建文件描述符。 log.end 更好的是因为他要求节点在录制后立即关闭。


var fs = require/'fs'/;
var logStream = fs.createWriteStream/'log.txt', {'flags': 'a'}/;
// use {'flags': 'a'} to append and {'flags': 'w'} to erase and write a new file
logStream.write/'Initial line...'/;
logStream.end/'this is the end line'/;

石油百科

赞同来自:

除了
appendFile

, 你也可以通过国旗
writeFile

, 将数据添加到现有文件。


fs.writeFile/'log.txt', 'Hello Node', {'flag':'a'}, function/err/ {
if /err/ {
return console.error/err/;
}
}/;


当通过旗帜时 'a' 数据将添加到文件的末尾。

君笑尘

赞同来自:

你需要打开它,然后写信给它。


var fs = require/'fs'/, str = 'string to append to file';
fs.open/'filepath', 'a', 666, function/ e, id / {
fs.write/ id, 'string to append to file', null, 'utf8', function//{
fs.close/id, function//{
console.log/'file closed'/;
}/;
}/;
}/;


以下是一些有助于解释参数的链接。

http://nodejs.org/api.html#fs-open-134
http://nodejs.org/api.html#fs-write-137
http://nodejs.org/api.html#fs-close-132

EDIT

: 此答案不再有效,查看新方法
http://nodejs.org/api/fs.html% ... lback
添加。

风见雨下

赞同来自:

结 0.8 它有
fs.appendFile

:


fs.appendFile/'message.txt', 'data to append', function /err/ {
if /err/ throw err;
console.log/'The "data to append" was appended to file!'/;
}/;


文件:
http://nodejs.org/docs/latest/ ... lback

风见雨下

赞同来自:

fd = fs.openSync/path.join/process.cwd//, 'log.txt'/, 'a'/
fs.writeSync/fd, 'contents to append'/
fs.closeSync/fd/

喜特乐

赞同来自:

如果您希望将Logs行的简单和压力方法写入文件,请推荐
https://github.com/jprichardson/node-fs-extra
:


const os = require/'os'/;
const fs = require/'fs-extra'/;

const file = 'logfile.txt';
const options = {flag: 'a'};

async function writeToFile/text/ {
await fs.outputFile/file, `${text}${os.EOL}`, options/;
}

writeToFile/'First line'/;
writeToFile/'Second line'/;
writeToFile/'Third line'/;
writeToFile/'Fourth line'/;
writeToFile/'Fifth line'/;


用node验证 v8.9.4.

裸奔

赞同来自:

我的方法非常特别。 我基本上使用解决方案
WriteStream

, 但实际上我不使用 'closing' fd, 使用
stream.end//

. 相反,我使用
cork

/
uncork

. 这给了低使用的优势 RAM /如果对某人而言/, 我相信使用用于伐木更安全/参赛作品 /我的初始使用选项/.

以下是一个相当简单的例子。 请注意,我刚刚添加了一个伪周期
for

用于展示制造代码,我正在等待消息 websocket.


var stream = fs.createWriteStream/"log.txt", {flags:'a'}/;
for/true/ {
stream.cork//;
stream.write/"some content to log"/;
process.nextTick/// => stream.uncork///;
}



uncork

将数据重置为下一个勾号中的文件。

在我的剧本中,有峰值 ~200 各种大小的每秒记录。 但是,在晚上,您只需每分钟几个记录。 即使在高峰时间内,代码也非常可靠地工作。

二哥

赞同来自:

我提出此优惠仅是因为对开放标志的控制有时是有用的,例如,您可以首先修剪现有文件,

然后

添加许多记录到它。 - 在这种情况下,使用标志 'w' 打开文件并不关闭它,直到所有记录都进行。 当然, appendFile 也许你在寻找什么 :-/


fs.open/'log.txt', 'a', function/err, log/ {
if /err/ throw err;
fs.writeFile/log, 'Hello Node', function /err/ {
if /err/ throw err;
fs.close/log, function/err/ {
if /err/ throw err;
console.log/'It\'s saved!'/;
}/;
}/;
}/;

郭文康

赞同来自:

使用包 jfile :


myFile.text+='\nThis is new line to be appended'; //myFile=new JFile/path/;

龙天

赞同来自:

使用
fs.appendFile

或者
fsPromises.appendFile

- 这是当您需要向文件添加内容时最快,最可靠的选项。

与一些提出的答案不同,如果传输文件的路径
appendFile

,

它实际上它本身就会关闭

. 只有当您通过文件句柄时,您就可以获得类似的东西
fs.open//

, 你必须照顾它的关闭。

我试图用的不仅仅是这样做 50 000 文件中的行。

例子 :


/async // => {
// using appendFile.
const fsp = require/'fs'/.promises;
await fsp.appendFile/
'/path/to/file', '\r\nHello world.'
/;

// using apickfs; handles error and edge cases better.
const apickFileStorage = require/'apickfs'/;
await apickFileStorage.writeLines/
'/path/to/directory/', 'filename', 'Hello world.'
/;
}///;


https://i.stack.imgur.com/9L3hy.gif
关联:
https://github.com/nodejs/node/issues/7560
执行示例:
https://github.com/apickjs/api ... es.js

诸葛浮云

赞同来自:

在这里你有一个完整的脚本。 填写文件名并运行它,它应该工作!
这里
https://www.youtube.com/watch?v=UxOpmMrZBto
根据脚本的逻辑。


var fs = require/'fs'/;

function ReadAppend/file, appendFile/{
fs.readFile/appendFile, function /err, data/ {
if /err/ throw err;
console.log/'File was read'/;

fs.appendFile/file, data, function /err/ {
if /err/ throw err;
console.log/'The "data to append" was appended to file!'/;

}/;
}/;
}
// edit this with your file names
file = 'name_of_main_file.csv';
appendFile = 'name_of_second_file_to_combine.csv';
ReadAppend/file, appendFile/;

喜特乐

赞同来自:

const inovioLogger = /logger = ""/ => {
const log_file = fs.createWriteStream/__dirname + `/../../inoviopay-${new Date//.toISOString//.slice/0, 10/}.log`, { flags: 'a' }/;
const log_stdout = process.stdout;
log_file.write/logger + '\n'/;
}

喜特乐

赞同来自:

此外

denysonique , 有时使用异步类型。
appendFile

和其他异步方法 NodeJS, 在哪里 promise 返回而不是传输回调。 为此,您需要将功能包装
promisify

HOF 或从名称空间导入异步函数 promises:


const { appendFile } = require/'fs'/.promises;

await appendFile/'path/to/file/to/append', dataToAppend, optionalOptions/;


我希望它会有所帮助

奔跑吧少年

赞同来自:

我包裹了 async fs.appendFile 在基于承诺的特征中。 我希望这将有助于别人看它会如何工作。


append /path, name, data/ {

return new Promise/async /resolve, reject/ => {

try {

fs.appendFile//path + name/, data, async /err/ => {

if /!err/ {

return resolve//path + name//;

} else {

return reject/err/;

}

}/;

} catch /err/ {

return reject/err/;

}

}/;

}

江南孤鹜

赞同来自:

尝试使用
flags: 'a'

将数据添加到文件中


var stream = fs.createWriteStream/"udp-stream.log", {'flags': 'a'}/;
stream.once/'open', function/fd/ {
stream.write/msg+"\r\n"/;
}/;

要回复问题请先登录注册