Node.js でのファイルの書き込み
-
21-09-2019 - |
質問
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!");
});
他のヒント
現在、ファイルを書き込む方法は 3 つあります。
fs.write(fd, buffer, offset, length, position, callback
)バッファがディスクに書き込まれることを確認するには、コールバックを待つ必要があります。バッファリングされていません。
fs.writeFile(filename, data, [encoding], callback)
すべてのデータは同時に保存する必要があります。シーケンシャル書き込みは実行できません。
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 層への 1 回の呼び出し。
現時点では、Node.js v0.12 (2015 年 2 月 6 日に発表された安定バージョン) では、次の 2 つの機能がサポートされるようになりました。cork()
そしてuncork()
. 。これらの関数により、最終的に書き込み呼び出しをバッファ/フラッシュできるようになるようです。
たとえば、Java には、バッファリングされたストリームを提供するクラスがいくつかあります (BufferedOutputStream
, BufferedWriter
...)。3 バイトを書き込むと、これらのバイトは 3 バイトだけの 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);
を使用します。
私は質問が(ファイルが存在するかどうか)それはファイルにテキストを追加するループでの使用に容易であるいくつかのケースで役に立つかもしれない「書き込み」について尋ねられたが、より一般的な意味「APPEND」で知っています。
:「\ 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、Node にはこのための機能が組み込まれているため、これは非常に簡単です。 fs
を表します ファイルシステム そして基本的に、 NodeJS ファイル システム モジュール...
したがって、最初にそれを要求します サーバー.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
文をuseingことで、このコールバック・インサイド・コールバックのコード構造を取り除きたいかもしれません。これは、非同期コードの構造がはるかにフラットになります。利用することができる便利な 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
がfalseの場合、ファイルディスクリプタはエラーがあります場合でも、閉じられません。これは、アプリケーションの責任は、それを閉じて、必ず何のファイルディスクリプタのリークがありませんようにすることです。のように ReadStream に、
に渡される必要があり、非ブロッキングfd
が指定されている場合は、<のhref = "HTTPS: //nodejs.org/api/fs.html#fs_class_fs_writestream」のrel = 『nofollowをnoreferrer』> WriteStream のpath
引数を無視し、指定したファイル記述子を使用します。何'open'
イベントが放出されません。この手段。fd
を阻止しなければなりません。fd
sは 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.');
}
});
}
}
あなたはライブラリを使用することができます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)
}
});