在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!"); });
目前有三种写入文件的方法:
-
fs.write(fd, buffer, offset, length, position, callback
)您需要等待callback才能确保将缓冲区写入磁盘。 它没有缓冲。
-
fs.writeFile(filename, data, [encoding], callback)
所有数据必须同时存储; 你不能执行顺序写入。
-
fs.createWriteStream(path, [options]
)创build一个
WriteStream
,这很方便,因为你不需要等待callback。 但是,它不是被缓冲的。
一个WriteStream
,正如名字所说,是一个stream。 根据定义,stream是包含向一个方向移动的数据的“缓冲区”(源►目的地)。 但是可写入的stream不一定是“缓冲”的。 当你写n
次时,一个stream被“缓冲”,在n+1
时刻,stream发送缓冲区到内核(因为它已经满了,需要刷新)。
换句话说: “缓冲区”是对象。 是否“被缓冲”是该对象的属性。
如果您查看代码,则WriteStream
inheritance可写的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的类( BufferedOutputStream
, BufferedWriter
…)。 如果您写入三个字节,这些字节将被存储在缓冲区(内存)中,而不是仅仅为三个字节进行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()