web-dev-qa-db-fra.com

Comment ajouter un fichier dans le noeud?

J'essaie de ajouter une chaîne dans un fichier journal. Cependant, writeFile effacera le contenu à chaque fois avant d'écrire la chaîne.

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

Une idée de comment faire cela facilement?

422
supercobra

Pour les ajouts occasionnels, vous pouvez utiliser appendFile, qui crée un nouveau descripteur de fichier chaque fois qu'il s'appelle:

Asynchrone :

const fs = require('fs');

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

synchrone :

const fs = require('fs');

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

Mais si vous ajoutez plusieurs fois au même fichier, il est bien préférable de réutiliser le descripteur de fichier .

684
denysonique

Lorsque vous voulez écrire dans un fichier journal, c'est-à-dire ajouter des données à la fin d'un fichier, jamais utilise appendFile, appendFile ouvre un descripteur de fichier pour chaque donnée ajoutée à votre fichier. Après un certain temps, vous obtenez une belle erreur EMFILE.

Je peux ajouter que appendFile n'est pas plus facile à utiliser qu'un WriteStream.

Exemple avec 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());

Jusqu'à 8000 sur mon ordinateur, vous pouvez ajouter des données au fichier, puis vous obtenez ceci:

{ 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' }

De plus, appendFile écrira quand il sera activé, ainsi vos journaux ne seront pas écrits par horodatage. Vous pouvez tester avec l'exemple, définissez 1000 à la place de 100000, l'ordre sera aléatoire, dépend de l'accès au fichier.

Si vous souhaitez ajouter un fichier à un fichier, vous devez utiliser un flux inscriptible comme celui-ci:

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

Tu finis quand tu veux. Vous n'êtes même pas obligé d'utiliser stream.end(), l'option par défaut est AutoClose:true, de sorte que votre fichier se termine à la fin du processus et que vous évitez d'ouvrir trop de fichiers.

157
Plaute

Votre code utilisant createWriteStream crée un descripteur de fichier pour chaque écriture. log.end est préférable car il demande au noeud de se fermer immédiatement après l'écriture.

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');
114
Fabio Ferrari

Outre appendFile, vous pouvez également passer un indicateur dans writeFile pour ajouter des données à un fichier existant.

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

En passant l'indicateur 'a', les données seront ajoutées à la fin du fichier.

21
A J

Vous devez l'ouvrir, puis lui écrire.

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

Voici quelques liens qui aideront à expliquer les paramètres

ouvert
écrire
close


EDIT: Cette réponse n'est plus valide, examinez la nouvelle méthode fs.appendFile pour l'ajout.

19
Corey Hart

Node.js 0.8 a fs.appendFile:

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

Documentation

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

Si vous voulez un moyen facile et sans stress d'écrire des journaux ligne par ligne dans un fichier, alors je vous recommande fs-extra :

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

Testé avec Node v8.9.4.

2
Benny Neugebauer

Je propose cette suggestion uniquement parce que le contrôle des drapeaux ouverts est parfois utile, par exemple, vous pouvez vouloir le tronquer en premier sur un fichier existant et then lui ajouter une série d'écritures - auquel cas utiliser le ' w 'flag lorsque vous ouvrez le fichier et ne le fermez pas avant que toutes les écritures soient terminées. Bien sûr, appendFile est peut-être ce que vous cherchez :-)

  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
balrob

Utiliser le package jfile :

myFile.text+='\nThis is new line to be appended'; //myFile=new JFile(path);
1
Abdennour TOUMI
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
sunilsingh

De la documentation de nodejs.

  // Creates /tmp/a/Apple, regardless of whether `/tmp` and /tmp/a exist.
    fs.mkdir('/tmp/a/Apple', { recursive: true }, (err) => {
      if (err) throw err;
    });

Sous Windows, l'utilisation de fs.mkdir () dans le répertoire racine, même avec la récursivité, génère une erreur:

    fs.mkdir('/', { recursive: true }, (err) => {
      // => [Error: EPERM: operation not permitted, mkdir 'C:\']
    });

Regardez https://nodejs.org/api/fs.html#fs_fs_mkdir_path_options_callback

0
Paolo

Voici un script complet. Remplissez vos noms de fichiers et exécutez-le et cela devrait fonctionner! Voici un tutoriel vidéo sur la logique derrière le script.

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
Jvieitez

un moyen plus facile de le faire est

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