我一直试图找到一种方式写入文件时使用Node.js但没有成功。我怎么可以那样做?

有帮助吗?

解决方案

有很多在细节文件系统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!");
}); 

其他提示

目前有三种方式编写一个文件:

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

    你需要等待回调,以确保缓冲写入磁盘。这不是缓冲。

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

    所有的数据都必须以储存在同一时间;你无法执行顺序写入。

  3. fs.createWriteStream(path, [options])

    创建一个 WriteStream, ,这是方便的,因为你不需要等待回调。但是,这不是缓冲。

一个 WriteStream, 如名称所说,是一个流。一流的定义是"缓冲区"包含数据的其中一个方向移动(资料来源►目的地)。但是一个可写入流不是必然"缓冲".一流的"缓冲"时你写的 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.js 0.12(稳定的版本宣布02/06/2015)现在支持两个功能:cork()uncork().看来,这些功能将最后能让你在缓冲/冲写的呼吁。

例如,在Java有一些课程,提供缓冲的流(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');
        })
    });
});

<强>同步写入

  

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

fs = require('fs');

fs.writeFileSync("synchronous.txt", "synchronous write!")

<强>异步写入

  

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

fs = require('fs');

fs.writeFile('asynchronous.txt', 'asynchronous write!', (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
});

<强>其中

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

值得读取官方文件系统(FS)文档

我喜欢 指数./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);获得该文件被写入。

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

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
 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");
                            });
                        }
                });

提供的日期的答案,并执行此更新的方法是:

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

在这里看到的文档获取更多信息

OK,这是因为节点具有内置的功能,这很简单,这就是所谓的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!');
});

您可以写信给使用 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');
    }
  });
};

您也可能想通过期运用承诺async / 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);
}

下面我们使用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”。

下面是如何读取从本地和写入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()

fs.createWriteStream(path[,options])

options 还可以包括一个 start 选项,以允许写入数据在某些位置的过去开始的文件。修改文件,而不是取代它可能需要一个 flags 模式 r+ 而不是默认的方式 w.编码可以是任何一个的那些接受 缓冲区.

如果 autoClose 被设置为真正的(默认行为)上 'error''finish' 该文件描述将会自动关闭。如果 autoClose 是虚假的,则该文件描述不会关闭,即使有一个错误。它是应用程序的责任是接近它,并确保没有任何文件描述泄漏。

喜欢 ReadStream, ,如果 fd 被指定, WriteStream 将忽略 path 参数,并将使用指定的文件的描述符。这意味着没有 'open' 事件将会发射。 fd 应当阻止;不阻塞 fds应该传递给 网。插座.

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

可以使用库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);
});

尝试以下方法:

fs.readFile(`${__dirname}/fileName`, 'utf-8',(err, contents) => {
    if (err) throw Error(err){
        console.log(contents)
    }
});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top