নোডের একটি ফাইলে কীভাবে সংযোজন করবেন?


505

আমি সংযোজন করার চেষ্টা করছি একটি লগ ফাইলে একটি স্ট্রিং । তবে WritFile স্ট্রিং লেখার আগে প্রতিটি সময় সামগ্রীটি মুছে ফেলবে।

fs.writeFile('log.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'

কোন সহজ ধারণা কীভাবে এটি করা যায়?

উত্তর:


798

মাঝেমধ্যে সংযোজনগুলির জন্য, আপনি ব্যবহার করতে পারেন appendFile, যা প্রতিটিবার যখনই বলা হয় একটি নতুন ফাইল হ্যান্ডেল তৈরি করে:

অবিচ্ছিন্নভাবে :

const fs = require('fs');

fs.appendFile('message.txt', 'data to append', function (err) {
  if (err) throw err;
  console.log('Saved!');
});

একযোগে :

const fs = require('fs');

fs.appendFileSync('message.txt', 'data to append');

কিন্তু আপনি যদি একই ফাইলে বারবার যোগ, এটা অনেক ভালো ফাইল হ্যান্ডেল পুনরায় ব্যবহার


6
নোড v0.8.0 থেকে
অস্বীকার

59
Fs.appendFile ফাইলের লিঙ্কটি খোলা রাখে যাতে অ্যাপেনডগুলি দ্রুত হয় তবে কেউ কি জানেন ? (প্রতিটি লেখার জন্য খোলা / বন্ধ করার চেয়ে) nodejs.org/api/…
নেলসোনিক

7
যদি এটি সুবিধাজনক হয় তবে মনে রাখবেন যে এটি অ্যাসিঙ্ক। এর ফলে অদ্ভুত সময় এবং অন্যান্য জিনিস হতে পারে। উদাহরণস্বরূপ: আপনার process.exit()ঠিক পরে থাকলে fs.appendFile, আউটপুট প্রেরণের আগে আপনি প্রস্থান করতে পারেন। (ব্যবহার returnকরা ভাল।)
সাইলেন্টস্টিলে

6
সবচেয়ে খারাপ ক্ষেত্রে, আপনি সিঙ্ক্রোনাস সংস্করণ ব্যবহার করতে পারেন appendFileSync,। nodejs.org/api/… তবে আপনি নোডের দুর্দান্ত সুবিধাগুলির মধ্যে একটি হারাতে পারেন, এটি অ্যাসিঙ্ক অপারেশন। আপনি ত্রুটিগুলি ধরা আছে তা নিশ্চিত করুন। সম্ভবত কিছু ওএসে, একই সময়ে ফাইল হ্যান্ডেলের অনুরোধ করা থাকলে আপনি অ্যাক্সেস অস্বীকার করতে পারেন। সে সম্পর্কে নিশ্চিত নই।
নিরব স্টিল

5
@ ক্রিসডিউ আপডেটের জন্য ধন্যবাদ .. তবে ... আমরা যদি এখানে স্বীকৃত উত্তরটি ব্যবহার না করি তবে আমাদের কী করা উচিত? কীভাবে এই দ্বিধা সমাধান করলেন?
জিপজিট

214

আপনি যখন কোনও লগ ফাইলে লিখতে চান, অর্থাত্ কোনও ফাইলের শেষে ডেটা যুক্ত করা হয় না , কখনই ব্যবহার করবেন নাappendFileappendFileআপনি নিজের ফাইলে যুক্ত প্রতিটি ডেটার জন্য একটি ফাইল হ্যান্ডেল খোলে, কিছুক্ষণ পরে আপনি একটি সুন্দর EMFILEত্রুটি পান।

আমি এটি যুক্ত করতে পারি যে appendFileএটির চেয়ে ব্যবহার করা সহজ নয় WriteStream

এর সাথে উদাহরণ appendFile:

console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
    fs.appendFile("append.txt", index+ "\n", function (err) {
        if (err) console.log(err);
    });
});
console.log(new Date().toISOString());

আমার কম্পিউটারে 8000 অবধি, আপনি ফাইলটিতে ডেটা যুক্ত করতে পারেন, তারপরে আপনি এটি পান:

{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
    at Error (native)
  errno: -4066,
  code: 'EMFILE',
  syscall: 'open',
  path: 'C:\\mypath\\append.txt' }

অধিকন্তু, appendFile এটি সক্ষম হয়ে গেলে লিখবে, সুতরাং আপনার লগগুলি টাইমস্ট্যাম্প দ্বারা লিখিত হবে না। আপনি উদাহরণ দিয়ে পরীক্ষা করতে পারবেন, 100000 এর স্থলে 1000 সেট করুন, অর্ডার এলোমেলো হবে, ফাইল অ্যাক্সেসের উপর নির্ভর করে।

আপনি যদি কোনও ফাইলে সংযোজন করতে চান তবে আপনার অবশ্যই এটির মতো একটি লিখিত প্রবাহ ব্যবহার করতে হবে :

var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
    stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();

আপনি যখন চান এটি শেষ। আপনার এমনকি ব্যবহারের প্রয়োজন নেই stream.end(), ডিফল্ট বিকল্পটি রয়েছে AutoClose:true, সুতরাং আপনার প্রক্রিয়াটি শেষ হয়ে গেলে আপনার ফাইলটি শেষ হয়ে যাবে এবং আপনি খুব বেশি ফাইল খুলতে এড়াবেন।


2
এটি স্পট অন।
পোগরিন্ডিস

3
দুর্দান্ত উত্তরের জন্য ধন্যবাদ, তবে আমার সন্দেহ হ'ল জাভাস্ক্রিপ্টের অ্যাসিনক্রোনাস প্রকৃতির কারণে এটি এর stream.end()আগে কার্যকর হবে stream.write(), সুতরাং আমাদের ব্যবহার করা উচিত নয় stream.end(), যেমনটি আপনি উল্লেখ করেছেন যে AutoClose:Trueএটি একটি ডিফল্ট বিকল্প, তবে কেন কোনও লাইন লিখতে বিরক্ত করবেন না যা কিছু নয় ব্যবহার করুন।
আশিষ কুমার

13
due to asynchronous nature of Javascript... কি? Array.forEach একটি সিঙ্ক্রোনাস অপারেশন। জেএস সমকালীন। প্রতিশ্রুতি এবং অ্যাসিঙ্ক / অপেক্ষার মতো অ্যাসিক্রোনাস অপারেশন পরিচালনা করার কিছু উপায় প্রদানের ক্ষেত্রে এটি ঘটে।
শারকাক্স

1
আমি অনুমান করতে পারি যে fs.appendFileঅনেকগুলি খোলার ফাইল রয়েছে কারণ আপনি এটি অ্যাসিনক্রোনাস পদ্ধতিতে কার্যকর করেছেন (আপনি কেবল অ্যাসিক্রোনালিকভাবে 10000 ফাইল হ্যান্ডেল তৈরি করছেন), আমি বিশ্বাস করি appendFileSyncযে fs.appendFileসঠিক বিরতি না দিয়েও একই রকম সমস্যা হবে না (1s সম্ভবত যথেষ্টের চেয়ে বেশি) বা সারিবদ্ধ।
আপেল আপেল

1
ব্যস্ত সার্ভার লগের জন্য @ রেডওয়ালফ প্রোগ্রামগুলি সম্ভবত সত্য। একবারে কার্যকর করা লগের জন্য, সম্ভবত না। যাইহোক, আমি কেবল উল্লেখ করছি যে এই উত্তরটির পয়েন্টটি (অন্তত কারণ) সঠিক নয়।
আপেল আপেল

122

আপনার কোড ক্রিয়েট্রাইটস্ট্রিম ব্যবহার করে প্রতিটি লেখার জন্য একটি ফাইল বর্ণনাকারী তৈরি করে। লগ.এন্ড ভাল কারণ এটি নোডকে লেখার সাথে সাথেই বন্ধ করতে বলে।

var fs = require('fs');
var logStream = fs.createWriteStream('log.txt', {flags: 'a'});
// use {flags: 'a'} to append and {flags: 'w'} to erase and write a new file
logStream.write('Initial line...');
logStream.end('this is the end line');

6
প্রথম লাইন মিস! হওয়া উচিত 'var fs = need (' fs ');'
স্টোরম্বাইটস

5
বা সম্ভবত আরও ভাল var fs = require('graceful-fs'), যা কিছু জ্ঞাত সমস্যা হ্যাশ করেছে। আরও তথ্যের জন্য ডক্স দেখুন ।
মার্কো বোনাচি

3
প্রাথমিক এবং শেষ উভয় লাইন একই লাইনে রয়েছে যদিও :
পি

5
দয়া করে নোট করুন : আপনি যদি ব্যবহার করেন fs.createWriteStreamতবে ব্যবহার করুন flags। আপনি যদি এটি ব্যবহার করেন fs.writeFileতবে এটি flag। আরও তথ্যের জন্য দয়া করে নোড জেএস ডক্স - ফাইল সিস্টেম পড়ুন ।
আনিস নায়ের

2
সাবধান হও! প্যারামিটারটি "পতাকা" নয় বরং "পতাকা" (একক একক): নোডেজ.এস.এগ্রি
বেনি

25

এছাড়াও appendFile, আপনি writeFileকোনও বিদ্যমান ফাইলে ডেটা যুক্ত করতে একটি পতাকাও পাস করতে পারেন ।

fs.writeFile('log.txt', 'Hello Node',  {'flag':'a'},  function(err) {
    if (err) {
        return console.error(err);
    }
});

পতাকা এ 'পাস' করার মাধ্যমে ফাইলের শেষে ডেটা যুক্ত করা হবে।


3
দয়া করে নোট করুন : আপনি যদি ব্যবহার করেন fs.createWriteStreamতবে ব্যবহার করুন flags। আপনি যদি এটি ব্যবহার করেন fs.writeFileতবে এটি flag। আরও তথ্যের জন্য দয়া করে নোড জেএস ডক্স - ফাইল সিস্টেম পড়ুন ।
আনিস নায়ার

19

আপনার এটি খুলতে হবে, তারপরে এটি লিখুন।

var fs = require('fs'), str = 'string to append to file';
fs.open('filepath', 'a', 666, function( e, id ) {
  fs.write( id, 'string to append to file', null, 'utf8', function(){
    fs.close(id, function(){
      console.log('file closed');
    });
  });
});

এখানে কয়েকটি লিঙ্ক রয়েছে যা পরামিতিগুলি ব্যাখ্যা করতে সহায়তা করবে

খোলা
লেখার
ঘনিষ্ঠ


সম্পাদনা : এই উত্তরটি আর বৈধ নয়, সংযোজনের জন্য নতুন fs.appendFile পদ্ধতিটি দেখুন।


1
দেখে মনে হচ্ছে সুপারকোবরা ক্রমাগত লগ ফাইলটিতে লগ লিখেন, fs.writ এর ব্যবহার এই ক্ষেত্রে সুপারিশ করা হয় না, পরিবর্তে fs.createWriteStream ব্যবহার করুন। Nodejs.org/docs/v0.4.8/api/all.html#fs.write
রাগান্বিত কিউই

10
নোডেজ v0.4.10 হিসাবে উত্তর আর সঠিক নয়।
রুবেল টান

এটি 666 এর পরিবর্তে '0666' হওয়া উচিত
ইয়া ঝুয়াং

13

নোড.জেএস 0.8 এর রয়েছে fs.appendFile:

fs.appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
});

নথিপত্র


3
fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)

5
যে কোনও সিঙ্ক () প্রায়শই সর্বদা একটি খারাপ ধারণা হয় যদি না আপনি 100% নিশ্চিত হন যে আপনি একেবারেই এটির প্রয়োজন নেই। তারপরেও, আপনি সম্ভবত এটি ভুল করছেন।
জেন ক্লেস

4
এর অর্থ এই নয় যে এটি ভুল। এটি কেবল এটি সুসংগতভাবে করে। নোড.জেএস এর জন্য সেরা অনুশীলন নাও হতে পারে তবে এটি সমর্থিত।
লুইস আর

2
আমি এই শব্দগুচ্ছের ইন্টারনেট-মেমের অর্থে "ইউর ডিন ইট ভুল" ব্যবহার করছিলাম। স্পষ্টতই এটি সমর্থিত = পি
জেন ক্লেস

7
অ্যাসিঙ্কের সাথে সম্মত, তবে কখনও কখনও যদি আপনি কেবল একটি ইন্টারেক্টিভ স্ক্রিপ্ট লেখেন তবে সিঙ্কটি ঠিক আছে।
ব্রায়ানম্যাক

7
আপনি যদি একক ব্যবহারকারী কমান্ড লাইন অ্যাপটি (উদাহরণস্বরূপ কিছু স্টাফ করার জন্য স্ক্রিপ্ট) করতে থাকেন তবে সুসংগতভাবে লিখন একেবারে ঠিক। এইভাবে স্টাফগুলি করা দ্রুত। এই উদ্দেশ্যে না হলে নোডের কেন সিঙ্ক পদ্ধতি রয়েছে?
জানু Śভিয়কি

3

আপনি যদি কোনও ফাইলে লাইন লাইন লগ লেখার কোনও সহজ এবং স্ট্রেস-মুক্ত উপায় চান তবে আমি এফএস-অতিরিক্ত প্রস্তাব দিচ্ছি :

const os = require('os');
const fs = require('fs-extra');

const file = 'logfile.txt';
const options = {flag: 'a'};

async function writeToFile(text) {
  await fs.outputFile(file, `${text}${os.EOL}`, options);
}

writeToFile('First line');
writeToFile('Second line');
writeToFile('Third line');
writeToFile('Fourth line');
writeToFile('Fifth line');

নোড v8.9.4 দিয়ে পরীক্ষিত।


2

আমার পদ্ধতির চেয়ে বিশেষ। আমি মূলত WriteStreamসমাধানটি ব্যবহার করি তবে আসলে এফডি ব্যবহার করে 'ক্লোজড' না করেই stream.end()। পরিবর্তে আমি cork/ ব্যবহার করি uncork। এটি স্বল্প র‌্যাম ব্যবহারের সুবিধা পেয়েছে (যদি তা কারও কাছে গুরুত্বপূর্ণ হয়) এবং আমি বিশ্বাস করি লগিং / রেকর্ডিংয়ের জন্য এটি ব্যবহার করা আরও নিরাপদ (আমার আসল ব্যবহারের ক্ষেত্রে)।

নিম্নলিখিতটি বেশ সহজ উদাহরণ is লক্ষ্য করুন আমি forশোকেস-এর জন্য একটি ছদ্ম লুপটি যুক্ত করেছি - প্রোডাকশন কোডে আমি ওয়েবসকেট বার্তাগুলির জন্য অপেক্ষা করছি।

var stream = fs.createWriteStream("log.txt", {flags:'a'});
for(true) {
  stream.cork();
  stream.write("some content to log");
  process.nextTick(() => stream.uncork());
}

uncork পরের টিকটিতে ফাইলটিতে ডেটা ফ্লাশ করবে।

আমার দৃশ্যে বিভিন্ন আকারে প্রতি সেকেন্ডে 200 ডলার পর্যন্ত পিক রয়েছে। রাতের সময় তবে প্রতি মিনিটে কেবল কয়েক মুঠো লেখার প্রয়োজন হয়। কোডটি শিখর সময়েও নির্ভরযোগ্যভাবে কাজ করে working


1

আমি কেবল এই পরামর্শটি প্রস্তাব করি কারণ খোলা পতাকাগুলিতে নিয়ন্ত্রণ করা কখনও কখনও দরকারী, উদাহরণস্বরূপ, আপনি প্রথমে এটি একটি বিদ্যমান ফাইলটি ছাঁটাই করতে পারেন এবং তারপরে একটি লেখার একটি সিরিজ যুক্ত করতে পারেন - এই ক্ষেত্রে ফাইলটি খোলার সময় 'ডাব্লু' পতাকা ব্যবহার করুন সমস্ত লেখার কাজ শেষ না হওয়া পর্যন্ত এটি বন্ধ করবেন না। অবশ্যই অ্যাপেন্ডফাইলে আপনি যা করতে পারেন :-)

  fs.open('log.txt', 'a', function(err, log) {
    if (err) throw err;
    fs.writeFile(log, 'Hello Node', function (err) {
      if (err) throw err;
      fs.close(log, function(err) {
        if (err) throw err;
        console.log('It\'s saved!');
      });
    });
  });


1

যখন আপনাকে কোনও ফাইলে কিছু সংযুক্ত করার দরকার হয় তখন সবচেয়ে দ্রুত এবং সবচেয়ে শক্তিশালী বিকল্পগুলি ব্যবহার করা fs.appendFileবা fsPromises.appendFileহয়।

প্রস্তাবিত কিছু উত্তরের বিপরীতে, যদি ফাইল পাথটি appendFileফাংশনে সরবরাহ করা হয় তবে এটি আসলে নিজে থেকে বন্ধ হয়ে যায় । আপনি যখন কোনও ফাইলহ্যান্ডেলে পাস করেন কেবল তখনই আপনাকে fs.open()এটি বন্ধ করার যত্ন নিতে হবে।

আমি একটি ফাইলে 50,000 এর বেশি লাইন দিয়ে চেষ্টা করেছি।

উদাহরণ:

(async () => {
  // using appendFile.
  const fsp = require('fs').promises;
  await fsp.appendFile(
    '/path/to/file', '\r\nHello world.'
  );

  // using apickfs; handles error and edge cases better.
  const apickFileStorage = require('apickfs');
  await apickFileStorage.writeLines(
    '/path/to/directory/', 'filename', 'Hello world.'
  );
})();

এখানে চিত্র বর্ণনা লিখুন

রেফ: https://github.com/nodejs/node/issues/7560
উদাহরণ কার্যকর করা: https://github.com/apickjs/apickFS/blob/master/writeLines.js


0

এখানে একটি সম্পূর্ণ স্ক্রিপ্ট। আপনার ফাইলের নাম পূরণ করুন এবং এটি চালান এবং এটি কাজ করা উচিত! স্ক্রিপ্টের পিছনে যুক্তি সম্পর্কিত একটি ভিডিও টিউটোরিয়াল এখানে ।

var fs = require('fs');

function ReadAppend(file, appendFile){
  fs.readFile(appendFile, function (err, data) {
    if (err) throw err;
    console.log('File was read');

    fs.appendFile(file, data, function (err) {
      if (err) throw err;
      console.log('The "data to append" was appended to file!');

    });
  });
}
// edit this with your file names
file = 'name_of_main_file.csv';
appendFile = 'name_of_second_file_to_combine.csv';
ReadAppend(file, appendFile);

0

এটি করার একটি সহজ উপায়

const fs = require('fs');
fs.appendFileSync('file.txt', 'message to append into file');

এর চেয়ে সহজ? আপনি কি শীর্ষের উত্তরটি যাচাই করেছেন, যা ঠিক একই appendFileSyncসমাধান দেয় ?
ড্যান ড্যাসক্লেস্কু

0
const inovioLogger = (logger = "") => {
    const log_file = fs.createWriteStream(__dirname + `/../../inoviopay-${new Date().toISOString().slice(0, 10)}.log`, { flags: 'a' });
    const log_stdout = process.stdout;
    log_file.write(logger + '\n');
}

0

ড্যানিসোনিকের উত্তর ছাড়াও , কখনও কখনও নোডজেএস-এ অ্যাসিনক্রোনাস ধরণের appendFileএবং অন্যান্য অ্যাসিঙ্ক পদ্ধতি ব্যবহার করা হয় যেখানে কলব্যাক পাসিংয়ের পরিবর্তে প্রতিশ্রুতি ফিরে আসে। এটি করার জন্য আপনাকে promisifyএইচএফ দিয়ে ফাংশনটি মোড়ানো বা প্রতিশ্রুতিদের নামস্থান থেকে অ্যাসিঙ্ক ফাংশন আমদানি করতে হবে:

const { appendFile } = require('fs').promises;

await appendFile('path/to/file/to/append', dataToAppend, optionalOptions);

আমি আশা করি এটি সাহায্য করবে 😉

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.