写入Node.js中的文件

我一直在尝试使用Node.js时写入文件的方法,但没有成功。我该怎么做?

1932455 次浏览

文件系统API中有很多细节。最常见的方式是:

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

你当然可以让它更高级一点。非阻塞,写入零碎,而不是一次写入整个文件:

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

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

  1. #0

    您需要等待回调以确保缓冲区被写入磁盘。它没有被缓冲。

  2. #0

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

  3. #0

    创建一个#0,这很方便,因为您不需要等待回调。但同样,它没有缓冲。

顾名思义,#0是一个流。根据定义,流是一个“缓冲区”,包含向一个方向(源►目标)移动的数据。但是可写的流不一定是“缓冲的”。当你写n次时,流是“缓冲的”,在时间n+1时,流将缓冲区发送到内核(因为它已满,需要刷新)。

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

如果你看一下代码,WriteStream继承自一个可写的Stream对象。如果你注意,你会看到他们是如何刷新内容的;他们没有任何缓冲系统。

如果您编写字符串,它会被转换为缓冲区,然后发送到本机层并写入磁盘。写入字符串时,它们不会填满任何缓冲区。所以,如果你这样做:

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

你正在做:

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

这是对I/O层的调用。虽然您使用的是“缓冲区”,但数据没有缓冲。缓冲流会做:fs.write(new Buffer ("abc")),对I/O层的一次调用。

截至目前,Node.jsv0.12(2015年6月2日发布的稳定版)现在支持两个功能:#0#0。似乎这些函数最终会允许您缓冲/刷新写入调用。

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

我没有发现任何东西,只是记住磁盘访问应该如何完成。

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

这里我们使用w+进行读/写操作,如果找不到文件路径,则会自动创建它。

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。

我喜欢./文章/文件系统的索引

它为我工作。

另见我如何写文件在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);获取文件写入的位置。

您可以使用库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);});
 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);elseconsole.log("success");});}});

以下是如何从本地读取文件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 : ',', // optionalquote     : '"' // 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()

同步写入

fs.writeFileSync(文件,数据[,选项])

fs = require('fs');
fs.writeFileSync("foo.txt", "bar");

异步写入

fs.write文件(文件,数据[,选项],回调)

fs = require('fs');
fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });

哪里

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

值得阅读官方文件系统(fs)文档

更新:异步/等待

fs = require('fs');util = require('util');writeFile = util.promisify(fs.writeFile);
fn = async () => { await writeFile('foo.txt', 'bar'); }
fn()

我知道这个问题是关于“写”的,但从更一般的意义上说,“追加”在某些情况下可能很有用,因为它很容易在循环中使用,将文本添加到文件中(无论文件是否存在)。如果你想添加行,请使用“\n”,例如:

var fs = require('fs');for (var i=0; i<10; i++){fs.appendFileSync("junk.csv", "Line:"+i+"\n");}

您可以使用fs(文件系统)模块写入文件。

这里有一个例子,你可以这样做:

const fs = require('fs');
const writeToFile = (fileName, callback) => {fs.open(fileName, 'wx', (error, fileDescriptor) => {if (!error && fileDescriptor) {// Do something with the file here ...fs.writeFile(fileDescriptor, newData, (error) => {if (!error) {fs.close(fileDescriptor, (error) => {if (!error) {callback(false);} else {callback('Error closing the file');}});} else {callback('Error writing to new file');}});} else {callback('Could not create new file, it may already exists');}});};

你可能还想通过使用Promisesasync/await语句来摆脱这种回调内部回调的代码结构。这将使异步代码结构更加扁平化。为此,可能会使用一个方便的util.promisify(原件)函数。它允许我们从回调切换到承诺。请看下面带有fs函数的示例:

// Dependencies.const util = require('util');const fs = require('fs');
// Promisify "error-back" functions.const fsOpen = util.promisify(fs.open);const fsWrite = util.promisify(fs.writeFile);const fsClose = util.promisify(fs.close);
// Now we may create 'async' function with 'await's.async function doSomethingWithFile(fileName) {const fileDescriptor = await fsOpen(fileName, 'wx');
// Do something with the file here...
await fsWrite(fileDescriptor, newData);await fsClose(fileDescriptor);}

fs.createWriteStream(path[,options])

options还可能包含一个start选项,允许在文件开头之后的某个位置写入数据。修改而不是替换文件可能需要r+flags模式而不是默认模式w。编码可以是缓冲区接受的任何一种编码。

如果autoClose'error''finish'上设置为true(默认行为),文件描述符将自动关闭。如果autoClose为false,则文件描述符不会关闭,即使出现错误。应用程序有责任关闭它并确保没有文件描述符泄漏。

读取流一样,如果指定了fd写流接口将忽略path参数并使用指定的文件描述符。这意味着不会发出'open'事件。fd应该是阻塞的;非阻塞的fd应该传递给net. Socket

如果options是字符串,则它指定编码。

读完这篇长篇文章后。你应该明白它是如何工作的。这里有一个createWriteStream()的例子。

/* The fs.createWriteStream() returns an (WritableStream {aka} internal.Writeable) and we want the encoding as 'utf'-8 *//* The WriteableStream has the method write() */fs.createWriteStream('out.txt', 'utf-8').write('hello world');

您可以通过以下代码示例写入文件:

var data = [{ 'test': '123', 'test2': 'Lorem Ipsem ' }];fs.open(datapath + '/data/topplayers.json', 'wx', function (error, fileDescriptor) {if (!error && fileDescriptor) {var stringData = JSON.stringify(data);fs.writeFile(fileDescriptor, stringData, function (error) {if (!error) {fs.close(fileDescriptor, function (error) {if (!error) {callback(false);} else {callback('Error in close file');}});} else {callback('Error in writing file.');}});}});

好的,这很简单,因为Node有内置的功能,它被称为fs,代表文件系统,基本上,NodeJS文件系统模块

所以首先需要它在你的server.js文件中,如下所示:

var fs = require('fs');

fs有一些方法可以写入文件,但我更喜欢的方法是使用appendFile,这将附加内容到文件中,如果文件不存在,将创建一个,代码可能如下所示:

fs.appendFile('myFile.txt', 'Hi Ali!', function (err) {if (err) throw err;console.log('Thanks, It\'s saved to the file!');});

提供的答案是过时的,更新的方法是:

const fsPromises = require('fs').promisesawait fsPromises.writeFile('/path/to/file.txt', 'data to write')

更多信息参见文档

您可以写入带有流的文件。

就像这样做:

const fs = require('fs');
const stream = fs.createWriteStream('./test.txt');stream.write("Example text");

要点1:

如果您想将某些内容写入文件。意味着:它将删除文件中已保存的任何内容并写入新内容。使用fs.promises.write文件()

项目2:

如果您想将某些内容附加到文件中。意味着:它不会删除任何已经保存在文件中的内容,而是在文件中附加新项content.then首先读取文件,然后将内容添加到可读值中,然后将其写入文件。


示例1:我想在我的JSON文件中写入一个JSON对象。

const fs = require('fs');const data = {table:[{id: 1, name: 'my name'}]}const file_path = './my_data.json'writeFile(file_path, data)async function writeFile(filename, writedata) {try {await fs.promises.writeFile(filename, JSON.stringify(writedata, null, 4), 'utf8');console.log('data is written successfully in the file')}catch (err) {console.log('not able to write data in the file ')}}

示例2:如果您想将数据附加到JSON文件。您想将数据{id: 1, name:'my name'}添加到同一文件夹根上的文件my_data.json。只需调用append_data(file_path、数据)函数。

如果文件存在,它将在JSON文件中附加数据。或者它将创建文件并将数据添加到其中。

const fs = require('fs');const data = {id: 2, name: 'your name'}const file_path = './my_data.json'append_data(file_path, data)
async function append_data(filename, data) {
if (fs.existsSync(filename)) {var read_data = await readFile(filename)if (read_data == false) {console.log('not able to read file')} else {read_data.table.push(data)  //data must have the table array in it like example 1var dataWrittenStatus = await writeFile(filename, read_data)if (dataWrittenStatus == true) {console.log('data added successfully')} else {console.log('data adding failed')}}}}
async function readFile(filePath) {try {const data = await fs.promises.readFile(filePath, 'utf8')return JSON.parse(data)}catch (err) {return false;}}
async function writeFile(filename, writedata) {try {await fs.promises.writeFile(filename, JSON.stringify(writedata, null, 4), 'utf8');return true}catch (err) {return false}}