Node.jsでのファイルの書き込み


1646

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

回答:


2465

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

26
私は、ノードを使用して、このスクリプトをテストしてきた、と私はへのファイルパスを変更しようとした「/ホーム/」が、私は次のエラーを得た:{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' } どのように私はそれが外に動作するように、このスクリプトを変更することができますか/tmp
アンダーソングリーン

130
また、fs.writeFileSync(...)を使用して、同じことを同期的に実行できることに注意してください。
David Erwin

7
少し古いかもしれませんが、@ AndersonGreen、ノードをrootまたはchmod / homeとして適切に実行し、現在のノードのプロセス所有者(ユーザー名は難しい)にR / W権限を許可して、ファイルを書き込むことができます
Denys Vitali

39
実際、@ DenysVitali、問題は、ジェーンがファイルをに書き込めないようにすることです/home/...。通常、そのディレクトリは755 root:wheel(またはその他)です。ノードがジェーンとしてファイルを書き込みたい場合は、に書き込むほうが簡単/home/jane/test.txtです。/home755よりも寛容なものに変更するのは大きな間違いです。
ジェーンアーク2014

7
@JaneAvrietteまあ、彼は/homeディレクトリにファイルを保存したかったので、chmodすることを提案しました。セキュリティ上の問題が発生する可能性があることは知っています。しかし、まあ、ユーザーがそこに保存したいのであれば、それが解決策です。PS:私はあなたの言ったことに同意します(:
Denys Vitali '29

537

現在、ファイルを書き込む方法は3つあります。

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

    バッファがディスクに確実に書き込まれるように、コールバックを待つ必要があります。バッファリングされていません。

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

    すべてのデータは同時に保存する必要があります。順次書き込みは実行できません。

  3. fs.createWriteStream(path, [options]

    を作成しますWriteStream。これは、コールバックを待つ必要がないため便利です。しかし、再び、それはバッファリングされていません。

WriteStream名前が示すように、A はストリームです。ストリームは、定義上、一方向に移動するデータを含む「バッファ」です(ソース►宛先)。ただし、書き込み可能なストリームは必ずしも「バッファリング」されるわけではありません。ストリームは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"))

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

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

私は何も発見していません。ディスクアクセスの方法を覚えているだけです。


5
+1-いい説明。書き込みストリームの場合、ドキュメントを注意深く読むことが重要です。falseまたはcloseを返す場合は、writer.once( 'drain'、function(){})を呼び出すことが重要です。または、プロセスの終了時にドレインされなかった行を逃しました。
bryanmac 14年

4
使用方法の例cork()uncork()、リリース前の0.11ノードを試してみたいと思っている人のために、例を挙げてください。
professormeowingtons

現在、Node v0.12は安定しています。
2015

GitHubからのコードの分析によると、fs.writeFileはあなたが言及した関数の中で最も人気があるようです。ここにあるfs.writeFileを使用するための実世界の例は
drorw

npmバッファリングされた書き込みの実装に関する本番環境品質のライブラリはありますか?
nponeccop

266

もちろん、もう少し高度にすることもできます。ノンブロッキングで、ファイル全体を一度に書き込むのではなく、少しずつ書き込みます。

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

17
stream.onceのコールバックに渡される「fd」変数は何ですか?
Scott Tesler、

1
@ScottDavidTeslerファイル記述子。ストリームを使い終わった後、ストリームを閉じることができます。
Alexey Kamenskiy

3
いつストリームを閉じますか?なぜこれがノンブロッキングなのですか?気になるのは、ログファイルに書き込もうとしていることです。
MetaGuru 2013年

1
ストリームがフラッシュされるかどうかはわかりません。オンデマンドでストリームをフラッシュする可能性があると私は推測しています。
Fredrik Andersson

1
@JoLissあなたはそれを待つ必要があります。
Fredrik Andersson

61

同期書き込み

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)のドキュメントを読む価値があります。


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

2
これは、低レベルのfs操作を使用してファイルを書き込む方法を示しています。たとえば、ファイルがディスクへの書き込みを終了し、ファイル記述子を解放したことを保証できます。
Sean Glover

この例では、オフセットが「0」(=の3番目のパラメーターfs.write())に設定されているため、この例は、すべてが1回の書き込み呼び出しで書き込むのに十分短い場合にのみ機能します。
マンフレッド

31

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


helloworld.txtファイルはどこにありますか?どのフォルダにも見つかりません...ありがとう。
Kai Feng Chew、2014

フォルダ内のスクリプトを実行することを
セルジオ

変だ…どこにも見つからない。非表示になりますか?おかげで再び〜
カイ風水は噛んで

6
見つけたところです。このROOT_APP_PATH = fs.realpathSync( '。');を使用します。console.log(ROOT_APP_PATH); ファイルが書き込まれた場所を取得します。ありがとう。
Kai Feng Chew

@セルジオ:書き込みファイルを閉じる必要がありますか?別のプロセスを呼び出していますが、ファイルが他のプロセスによって使用されているというエラーメッセージが表示されます。
アミール

24

提供される回答には日付が付けられており、これを行う新しい方法は次のとおりです。

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

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


1
(node:23759) ExperimentalWarning: The fs.promises API is experimental
jgraup

@jgraup:最新バージョンのノードを使用していますか?
TrevTheDev

ノードv10.15.0
jgraup

7
囲んでいる関数は非同期でなければなりません。そうでないと機能しません。
Zimano

1
@wintercounterそれはかなり甘いです!
Zimano

19

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

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

それが利用可能になったので、特に、やや大きなコードベースで作業している場合は、不要な副作用を回避するためconstvar、の代わりにを使用const fs = require('fs');することをお勧めします。
マンフレッド

11

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

3
文字列内の単一引用符はエスケープする必要があります。
Tamer

9
 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");
                            });
                        }
                });

「to.text」にデータを書き込んでいるところはどこですか?
Ravi Shanker Reddy

この回答は、既存の複数の回答に何を追加しwriteFileますか?
Dan Dascalescu、

9

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

またuseingにより、このコールバック・インサイド・コールバックのコード構造を取り除きたいかもしれない約束async/ await文を。これにより、非同期コードの構造がよりフラットになります。これを行うには、便利なutil.promisify(original)関数を使用できます。コールバックからpromiseに切り替えることができます。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);
}

1
なぜこれらのスニペットであり、コードの一部ではないのですか?とにかく、ブラウザで実行することはできません。
Zimano

@Zimano私が理解しているように、質問はnodejsに関するものだったので、ブラウザで実行できる必要はありません。
マンフレッド

1
@Manfredまさに!私が言っていることをあなたは誤解していたと思います。nodejsなので、スニペットを作成しても意味がありません。
Zimano

5

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


3

これは、ローカルからファイル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()

1
これにより、質問に関係のないあらゆる種類の複雑化(MongoClient、JSONなど)が発生します。
Dan Dascalescu、

3

fs.createWriteStream(path[,options])

optionsまたstart、ファイルの先頭を過ぎた位置にデータを書き込むことを許可するオプションが含まれる場合もあります。ファイルを置き換えるのではなく変更するには、デフォルトモードflagsr+はなくのモードが必要になる場合がありますw。エンコーディングは、Bufferが受け入れるもののいずれかです。

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

ReadStreamと同様に、fd指定されている場合、WriteStreampath引数を無視し、指定されたファイル記述子を使用します。つまり、'open'イベントは発行されません。fdブロッキングする必要があります。非ブロッキングfdnet.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');

createWriteStreamこの問題の前の複数の回答ですでに言及されていました。
Dan Dascalescu、

0

ライブラリを使用できます 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
This modules is created to save and remove files.。答えではありません。
Green

-1

次のコード例を使用して、ファイルに書き込むことができます。

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

1
writeFile何年も前にすでに回答として何度も与えられていました。この答えは何を追加しますか?
Dan Dascalescu、

また、なぜあなたはファイルを開くのですか?答えはファイルの書き込みに関するものではありませんか?
ミカル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.