在Node.js中编写文件

我一直在试图find一种方法来使用Node.js写入文件,但没有成功。 我怎样才能做到这一点?

文件系统API中有很多细节。 最常见的方式(据我所知)是:

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

目前有三种写入文件的方法:

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

    您需要等待callback才能确保将缓冲区写入磁盘。 它没有缓冲。

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

    所有数据必须同时存储; 你不能执行顺序写入。

  3. fs.createWriteStream(path, [options]

    创build一个WriteStream ,这很方便,因为你不需要等待callback。 但是,它不是被缓冲的。

一个WriteStream ,正如名字所说,是一个stream。 根据定义,stream是包含向一个方向移动的数据的“缓冲区”(源►目的地)。 但是可写入的stream不一定是“缓冲”的。 当你写n次时,一个stream被“缓冲”,在n+1时刻,stream发送缓冲区到内核(因为它已经满了,需要刷新)。

换句话说: “缓冲区”是对象。 是否“被缓冲”是该对象的属性。

如果您查看代码,则WriteStreaminheritance可写的Stream对象。 如果你注意,你会看到他们如何冲洗的内容; 他们没有任何缓冲系统。

如果你写了一个string,它会被转换成一个缓冲区,然后被发送到本地层并被写入磁盘。 在编写string时,它们没有填充任何缓冲区。 所以,如果你这样做:

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

你在做:

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

这是对I / O层的三个调用。 尽pipe您使用的是“缓冲区”,但数据不会被缓冲。 缓冲stream将执行: fs.write(new Buffer ("abc")) ,一个调用I / O层。

截至目前,Node.js v0.12(2015年6月2日发布的稳定版本)现在支持两种function: cork()cork() uncork() 。 看来这些函数将最终允许您缓冲/刷新写入调用。

例如,在Java中有一些提供缓冲stream的类( BufferedOutputStreamBufferedWriter …)。 如果您写入三个字节,这些字节将被存储在缓冲区(内存)中,而不是仅仅为三个字节进行I / O调用。 当缓冲区满时,内容被刷新并保存到磁盘。 这提高了性能。

我没有发现任何东西,只记得应该如何进行磁盘访问。

你当然可以让它更先进一点。 非阻塞,写点东西,不要一次写整个文件:

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

我喜欢./articles/file-system的索引

它为我工作。

另请参见如何在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'); }); 

helloworld.txt的内容:

 Hello World! 

更新:
就像在Linux节点上写入当前目录一样,在其他一些目录中似乎没有,所以我添加这个注释以防万一:
使用这个ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH); 获取文件的写入位置。

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

例如:读取文件并写入另一个文件:

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

这里我们使用w +来读/写这两个动作,如果文件path没有find,它会自动创build。

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

内容意味着你必须写入文件及其长度,'content.length'。

您可以使用图书馆easy-file-manager

首先从npm npm install easy-file-manager

示例上传和删除文件

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

以下是如何从本地读取文件csv并将csv文件写入本地的示例。

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