web-dev-qa-db-ja.com

Node.jsにファイルを書き込む

Node.jsを使用しているときにファイルに書き込む方法を見つけようとしましたが、成功しませんでした。どうやってやるの?

1311
Gjorgji

ファイルシステム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!");
}); 
2061
Brian McKenna

現在ファイルを書くための3つの方法があります:

  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層へのthree呼び出しです。 「バッファ」を使用していますが、データはバッファされていません。バッファリングされたストリームは、fs.write(new Buffer ("abc"))、I/O層への1回の呼び出しで行うことができます。

現時点では、Node.js v0.12(2015年2月6日発表の安定版)では、 cork()uncork() の2つの関数がサポートされています。これらの関数はついに書き込み呼び出しをバッファ/フラッシュすることを可能にするようです。

たとえば、Javaにはバッファ付きストリームを提供するクラスがいくつかあります(BufferedOutputStreamBufferedWriter...)。 3バイトを書き込むと、これらのバイトは3バイトだけ入出力呼び出しをするのではなく、バッファー(メモリー)に保管されます。バッファがいっぱいになると、コンテンツはフラッシュされてディスクに保存されます。これによりパフォーマンスが向上します。

私は何も発見していません。ディスクアクセスがどのように行われるべきかを覚えているだけです。

474
Gabriel Llamas

もちろん、もう少し高度にすることもできます。ノンブロッキング、ビット単位の書き込み、一度にファイル全体の書き込みは行わない

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();
});
216
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');
        })
    });
});
42
Mister P

./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);を使ってファイルが書かれている場所を取得します。

26
Sérgio

同期書き込み

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) docs を読む価値があります。

21
Moriarty

私は「write」についての質問を受けたことを知っていますが、より一般的な意味では「append」はファイルにテキストを追加するためにループで使うのが簡単なので役に立つ場合があります。行を追加したい場合は "\ n"を使用してください。

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

ここでは、両方のアクションの読み取り/書き込みに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'を意味します。

4
Gunjan Patel

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

Promises およびasync/awaitステートメントを使用して、このcallback-inside-callbackコード構造体を削除することもできます。これにより、非同期コード構造がよりフラットになります。それをするためには便利な 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);
}

4

これは、ローカルから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()
3
KARTHIKEYAN.A

あなたはライブラリ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);
});
2
Christoper

次のコード例でファイルに書き込むことができます。

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

提供された答えは日付を記入されており、これを行うための新しい方法は以下のとおりです。

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

詳細についてはここのdocoを参照してください

1
TrevTheDev

そう、Nodeにはこの機能が組み込まれているので非常に単純です。これはfsと呼ばれ、 File System そして基本的には NodeJS File Systemモジュール ...

それで最初にあなたの 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!');
});
1
Alireza

fs.createWriteStream(path[,options])

optionsには、ファイルの先頭を超えた位置にデータを書き込むことを可能にするstartオプションも含めることができます。ファイルを置き換えるのではなく変更するには、デフォルトモードのflagsではなくr+wモードが必要になる場合があります。エンコーディングは Buffer で受け入れられているもののどれでも構いません。

'error'または'finish'autoCloseがtrue(デフォルトの動作)に設定されている場合、ファイル記述子は自動的に閉じられます。 autoCloseがfalseの場合、エラーがあってもファイル記述子は閉じられません。それを閉じてファイルディスクリプタリークがないことを確認するのはアプリケーションの責任です。

ReadStream のように、fdが指定されている場合、 WriteStreampath引数を無視し、指定されたファイル記述子を使用します。これは'open'イベントが発行されないことを意味します。 fdはブロックする必要があります。ノンブロッキングfdsは 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');
0
user9258013

以下を試してください。

fs.readFile(`${__dirname}/fileName`, 'utf-8',(err, contents) => {
    if (err) throw Error(err){
        console.log(contents)
    }
});
0
sultan aslam