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?
Pour les ajouts occasionnels, vous pouvez utiliser appendFile
, qui crée un nouveau descripteur de fichier chaque fois qu'il s'appelle:
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');
Mais si vous ajoutez plusieurs fois au même fichier, il est bien préférable de réutiliser le descripteur de fichier .
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.
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');
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.
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
EDIT: Cette réponse n'est plus valide, examinez la nouvelle méthode fs.appendFile pour l'ajout.
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!');
});
fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)
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.
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!');
});
});
});
Utiliser le package jfile :
myFile.text+='\nThis is new line to be appended'; //myFile=new JFile(path);
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');
}
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
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);
un moyen plus facile de le faire est
const fs = require('fs');
fs.appendFileSync('file.txt', 'message to append into file');