Skip to content

Instantly share code, notes, and snippets.

@cirocosta
Last active July 22, 2022 19:57
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save cirocosta/f0e7f16718d739a13dee to your computer and use it in GitHub Desktop.
Save cirocosta/f0e7f16718d739a13dee to your computer and use it in GitHub Desktop.
Manuseando Arquivos com Nodejs
/**
* Copies a file from source to target if everything goes well with
* the streams. CB may receive an argument if an error occurs.
*/
function copyFile(source, target, cb) {
var fs = require('fs');
var cbCalled = false;
var wr;
var rd;
var _done = function (err) {
if (!cbCalled) {
cb(err);
cbCalled = true;
}
};
rd = fs.createReadStream(source);
rd.on("error", function(err) {
_done(err);
});
wr = fs.createWriteStream(target);
wr.on("error", function(err) {
_done(err);
});
wr.on("close", function(ex) {
_done();
});
rd.pipe(wr);
}
module.exports = copyFile;
/**
* Recursively removes files/dir from a path. If an error happens, it
* returns it with the callback.
*/
var deleteDirR = function(path, cb) {
var fs = require('fs');
var files = [];
var curPath = '';
if (fs.existsSync(path)) {
files = fs.readdirSync(path);
files.forEach(function(file,index){
curPath = path + '/' + file;
if (fs.lstatSync(curPath).isDirectory())
deleteDirR(curPath, cb);
else
fs.unlinkSync(curPath);
});
fs.rmdirSync(path);
cb(null);
} else {
cb(new Error('The path passed does not exist.'));
}
};
module.exports = deleteDirR;

Manuseando arquivos com compabilidade entre SOs

Criar Pastas

Para criação de pastas o mais conveniente (unix) é utilizar mkdir -p, o qual:

-p, --parents no error if existing, make parent directories as needed

tem-se então o semelhante como módulo de node, o mkdirp.

var mkdirp = require('mkdirp');

mkdirp('/tmp/foo/bar/baz', function (err) {
    if (err) console.error(err)
    else console.log('pow!')
});

Mover Arquivos

Tal como ocorre em unix (mv a b), para mover um arquivo basta renomeá-lo para um outro sendo especificado o diretório e mantendo o nome, em tal caso.

Copiar Arquivos

Utilizar copy-file.js, o qual recebe (source, target, callback), sendo que o callback receberá um arugmento se houver erro; caso contrário, nada.

Criar Arquivos

Para criar arquivos basta utilizarmos o semelhante ao cat > arquivo:

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

podendo-se passar como argumento um buffer.

Deletar Arquivos

Para deletarmos arquivos precisamos simplesmente utilizar o fs.unlink(path, callback).

Deleter Pastas

Para deletar pastas temos um método fs.rmdir. Este, entretanto, assim como em UNIX, apenas remove pastas vazias:

rmdir - remove empty directories : Remove the DIRECTORY(ies), if they are empty.

Para que possamos então remover um diretório e seus arquivos precisamos então definir uma função recursiva (e sícrona) para tal (tal como implementado em delete-dir.js).

#!/usr/bin/env node
var mkdirp = require('mkdirp');
var async = require('async');
var copyFile = require('./copy-file');
var deleteDirR = require('./delete-dir-r.js');
var fs = require('fs');
//////////
// argv //
//////////
switch(process.argv[2]){
case '--deletedir':
deleteDirSample();
break;
default:
main();
}
//////////////
// fun defs //
//////////////
function deleteDirSample () {
deleteDirR('./diretorio', function (err) {
if (err) throw err;
});
}
function main () {
async.series([
function (callback) {
fs.writeFile('sample.txt', 'Dahora!', function (err) {
if (err) callback(err);
callback(null, 'Wrote to sample.txt, a new file');
});
},
function (callback) {
mkdirp('./dahora', function (err) {
if (err) callback(err);
callback(null, 'Created ./dahora dir');
});
},
function (callback) {
fs.rename('./sample.txt', './dahora/sample.txt', function (err) {
if (err) callback(err);
callback(null, 'Moved ./sample.txt to ./dahora/sample.txt');
});
},
function (callback) {
copyFile('./dahora/sample.txt', './dahora/sample2.txt', function (err) {
if (err) callback(err);
callback(null, 'Copied dahora/sample.txt to dahora/sample2.txt');
});
}
], function (err, results) {
if (err) {
console.log(err);
return;
}
console.log('Done!');
console.log(results);
});
}
@gabrielrufino
Copy link

Cool!!

@viniciusfreitasrj17
Copy link

Perfect !!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment