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

2010年03月23日に質問されました。  ·  閲覧回数 1.6M回  ·  ソース

Gjorgji picture
2010年03月23日

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

回答

Brian McKenna picture
2010年03月23日
2570

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

// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
Gabriel Llamas picture
2012年04月29日
549

現在、ファイルを書き込む方法は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層への3回の呼び出しです。 「バッファ」を使用していますが、データはバッファリングされていません。 バッファリングされたストリームは次のようになります: fs.write(new Buffer ("abc")) 、I / O層への1回の呼び出し。

現在のところ、Node.js v0.12(2015年2 cork()発表された安定バージョン)では、 uncork() 2つの関数がサポートされるようになりました。 これらの関数により、最終的に書き込み呼び出しをバッファリング/フラッシュできるようになるようです。

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

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

Fredrik Andersson picture
2011年08月05日
279

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

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();
});
Moriarty picture
2018年05月17日
71

同期書き込み

fs.writeFileSync(file、data [、options])

fs = require('fs');

fs.writeFileSync("foo.txt", "bar");

非同期書き込み

fs.writeFile(ファイル、データ[、オプション]、コールバック)

fs = require('fs');

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

どこ

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

公式のファイルシステム(fs)のドキュメントを読む価値があります。

更新:async / await

fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);

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

fn()
Mister P picture
2013年12月16日
54
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');
        })
    });
});
S&#233;rgio picture
2014年11月08日
33

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

TrevTheDev picture
2019年04月28日
29

提供された回答は古く、これを行うための新しい方法は次のとおりです。

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

詳細については、こちらのドキュメントを参照してください

Astra Bear picture
2018年05月28日
23

「書き込み」についての質問は知っていますが、ファイルにテキストを追加するためにループで簡単に使用できるため、より一般的な意味で「追加」が役立つ場合があります(ファイルが存在するかどうかは関係ありません)。 行を追加する場合は、「\ n」を使用します。例:

var fs = require('fs');
for (var i=0; i<10; i++){
    fs.appendFileSync("junk.csv", "Line:"+i+"\n");
}
Alireza picture
2019年01月28日
14

OK、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!');
});
Oleksii Trekhleb picture
2018年09月20日
12

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ステートメントを使用して、このcallback-inside-callbackコード構造を取り除くこともできます。 これにより、非同期コード構造がはるかにフラットになります。 そのために、便利なutil.promisify(original)関数を使用できます。 これにより、コールバックからプロミスに切り替えることができます。 以下の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);
}