node.js remover arquivo

Respostas:

804

Eu acho que você quer usar fs.unlink.

Mais informações fspodem ser encontradas aqui .

usuario
fonte
137
Eu acredito que vem do padrão POSIX. Mas você pensaria que eles poderiam adicionar um deletealias!
Nick
11
@Nick ou um rmFilepseudônimo
PixnBits
9
@PixnBits ou um rmapelido se eles têm rmdirmétodos
Robin
8
para usuário do Meteor, você pode querer usarfs.unlinkSync()
Erdal G.
3
Eu acho que você deve fornecer um exemplo inteiro, os links podem mudar.
22416 Vasilevich
223

Você pode ligar fs.unlink(path, callback)para desvincular assíncrono (2) ou fs.unlinkSync(path)desvincular síncrono (2).
Onde pathestá o caminho do arquivo que você deseja remover.

Por exemplo, queremos remover o discovery.docxarquivo do c:/bookdiretório Então, meu caminho do arquivo é c:/book/discovery.docx. Portanto, o código para remover esse arquivo será,

var fs = require('fs');
var filePath = 'c:/book/discovery.docx'; 
fs.unlinkSync(filePath);
Código fonte
fonte
64

Se você deseja verificar o arquivo antes de excluir, se ele existe ou não. Portanto, use fs.stat ou fs.statSync ( Synchronous ) em vez de fs.exists. Porque, de acordo com a documentação mais recente do node.js. , fs.existsagora descontinuada .

Por exemplo:-

 fs.stat('./server/upload/my.csv', function (err, stats) {
   console.log(stats);//here we got all information of file in stats variable

   if (err) {
       return console.error(err);
   }

   fs.unlink('./server/upload/my.csv',function(err){
        if(err) return console.log(err);
        console.log('file deleted successfully');
   });  
});
vinha
fonte
E se eu verificar se ele existe, mas está bloqueado por outro processo - ou, eu verifico se ele existe e tudo bem, mas outro processo o bloqueia aleatoriamente antes que eu possa excluir. Como posso bloquear logo após a verificação? em seguida, não tomaria eu não seja possível excluir a sua bloqueado
4
Observe que fs.exists () está obsoleto, mas fs.existsSync () não está.
Tim
1
Há uma razão pela qual ela foi descontinuada: muitas vezes você cria uma condição de corrida se verificar se existe um arquivo antes de excluí-lo. Em vez disso, você deve chamar apenas fs.unlinke, se o arquivo não existir, ocorrerá um ENOENTerro no retorno de chamada. Não há necessidade de verificar antes de tentar desvincular.
ZachB
@ZachB por que a operação de exclusão é fs.unlinkexecutada quando o arquivo não existe, então minha opinião é que verifique o arquivo antes de remover.
vineet
Você não deve verificar se existe, se houver vários encadeamentos ou processos que possam estar usando ou tentando excluir o mesmo arquivo; nesse caso, a verificação da existência do arquivo se tornará inválida entre o momento em que você verifica a existência e o horário. você tenta excluí-lo. Basta verificar o código de erro ENOENT no unlinkretorno de chamada. Se esse erro ocorreu, o arquivo não existia. Veja a resposta da Searene, por exemplo.
ZachB
34

Eu não acho que você precise verificar se o arquivo existe ou não, fs.unlinkirá verificar por você.

fs.unlink('fileToBeRemoved', function(err) {
    if(err && err.code == 'ENOENT') {
        // file doens't exist
        console.info("File doesn't exist, won't remove it.");
    } else if (err) {
        // other errors, e.g. maybe we don't have enough permission
        console.error("Error occurred while trying to remove file");
    } else {
        console.info(`removed`);
    }
});
Searene
fonte
Como posso obter o nome da imagem anterior em Nosso controlador?
precisa
26

Aqui está um pequeno trecho que eu fiz para esse fim,

var fs = require('fs');
var gutil = require('gulp-util');

fs.exists('./www/index.html', function(exists) {
  if(exists) {
    //Show in green
    console.log(gutil.colors.green('File exists. Deleting now ...'));
    fs.unlink('./www/index.html');
  } else {
    //Show in red
    console.log(gutil.colors.red('File not found, so not deleting.'));
  }
});
Desconhecido
fonte
4
Async existe é obsoleto nodejs.org/api/fs.html#fs_fs_exists_path_callback
Mirodinho
2
E se o arquivo for excluído por outras pessoas depois de verificar fs.existse antes de removê-lo fs.unlink? Poderia acontecer.
Searene
4
Você não deve verificar se existe um arquivo antes de tentar desvinculá-lo. Basta ligar unlinke, se não existir, manipular o ENOENTerro. Caso contrário, você pode criar uma condição de corrida.
ZachB
9

Como resposta aceita, use fs.unlinkpara excluir arquivos.

Mas de acordo com a documentação do Node.js.

Usando fs.stat()para verificar a existência de um arquivo antes de chamar fs.open(), fs.readFile()ou fs.writeFile()não é recomendado. Em vez disso, o código do usuário deve abrir / ler / gravar o arquivo diretamente e lidar com o erro gerado se o arquivo não estiver disponível.

Para verificar se existe um arquivo sem manipulá-lo posteriormente, fs.access()é recomendável.

Para verificar arquivos podem ser excluídos ou não, Use fs.accessem vez

fs.access('/etc/passwd', fs.constants.R_OK | fs.constants.W_OK, (err) => {
  console.log(err ? 'no access!' : 'can read/write');
});
jasperjian
fonte
Esta é uma boa resposta, com uma referência ao Node.js. a maioria das pessoas usará unlinkdiretamente porque elas sabem que têm direitos para excluir o arquivo. Mas fs.accessé uma boa alternativa se eles precisarem verificar antes da exclusão. Mas acho que se eles precisam verificar se existe um arquivo sem manipulá-lo depois, devem usar naturalmente fs.stat, fs.accesstem um propósito diferente na minha humilde opinião.
precisa saber é o seguinte
a razão pela qual a documentação recomenda a verificação da existência é que essas informações podem mudar entre sua chamada para fs.stat / fs.access e a operação real. Por exemplo, o arquivo pode existir quando você chama fs.access e, em seguida, é excluído antes de chamar fs.unlink, ou as permissões podem mudar entre as duas chamadas. Como você precisa lidar com os códigos de erro do fs.unlink, nesse caso, não há sentido em chamar fs.stat ou fs.access.
Jannis Froese
6

Aqui abaixo do meu código que funciona bem.

         const fs = require('fs');
         fs.unlink(__dirname+ '/test.txt', function (err) {            
              if (err) {                                                 
                  console.error(err);                                    
              }                                                          
             console.log('File has been Deleted');                           
          });                                                            
Thavaprakash Swaminathan
fonte
Gosto mais desta resposta porque é a resposta mais completa e correta para aqueles que desejam saber como executar algo após a desassociação ser concluída e não se preocupam em personalizar a mensagem de erro.
Colin Keenan
por que você está usando __dirname? Gostaria de saber se poderíamos colocar um caminho relativo em vez de caminho completo?
The Bumpaster
6

2019 e o Nó 10+ está aqui . Abaixo da versão usando o modo doce assíncrono / aguardado .

Agora não há mais a necessidade de envolver o fs.unlinkPromises nem de usar pacotes adicionais (como fs-extra).

Basta usar a API nativa do Promises fs .

const fs = require('fs').promises;

(async () => {
  try {
    await fs.unlink('~/any/file');
  } catch (e) {
    // file doesn't exist, no permissions, etc..
    // full list of possible errors is here 
    // http://man7.org/linux/man-pages/man2/unlink.2.html#ERRORS
    console.log(e);
  }
})();

Aqui estão as fsPromises.unlink especificações dos documentos do Node.

Observe também que a API fs.promises marcada como experimental no Nó 10.xx (mas funciona totalmente bem), e não é mais experimental desde então 11.14.0.

Artyom Pranovich
fonte
3

você pode usar o módulo del para remover um ou mais arquivos no diretório atual. o que é legal nisso é que o protege contra a exclusão do diretório de trabalho atual e acima.

const del = require('del');
del(['<your pathere here>/*']).then( (paths: any) => {
   console.log('Deleted files and folders:\n', paths.join('\n'));
});
amazia
fonte
Se você precisar excluir vários arquivos, esta é uma ótima opção! Obrigado pela sugestão.
Samuel Earl
2

Você pode usar a função fs.unlink (caminho, retorno de chamada) . Aqui está um exemplo do wrapper de função com o padrão "error-back":

// Dependencies.
const fs = require('fs');

// Delete a file.
const deleteFile = (filePath, callback) => {
  // Unlink the file.
  fs.unlink(filePath, (error) => {
    if (!error) {
      callback(false);
    } else {
      callback('Error deleting the file');
    }
  })
};

Oleksii Trekhleb
fonte
2

Remova os arquivos do diretório que corresponde à regexp para o nome do arquivo. Utilizado apenas fs.unlink - para remover arquivos, fs.readdir - para obter todos os arquivos de um diretório

var fs = require('fs');
const path = '/path_to_files/filename.anyextension'; 

const removeFile = (fileName) => {
    fs.unlink(`${path}${fileName}`, function(error) {
        if (error) {
            throw error;
        }
        console.log('Deleted filename', fileName);
    })
}

const reg = /^[a-zA-Z]+_[0-9]+(\s[2-4])+\./

fs.readdir(path, function(err, items) {
    for (var i=0; i<items.length; i++) {
        console.log(items[i], ' ', reg.test(items[i]))
        if (reg.test(items[i])) {
           console.log(items[i])
           removeFile(items[i]) 
        }
    }
});
Xenia Lvova
fonte
2

É muito fácil com o fs.

var fs = require('fs');
try{
 var sourceUrls = "/sampleFolder/sampleFile.txt";
 fs.unlinkSync(sourceUrls);
}catch(err){
 console.log(err);
}
Susampath
fonte
-1

Aqui o código onde você pode excluir o arquivo / imagem da pasta.

var fs = require('fs'); 
Gallery.findById({ _id: req.params.id},function(err,data){ 
    if (err) throw err;
    fs.unlink('public/gallery/'+data.image_name);
 });
Mahesh singh chouhan
fonte
Desde o nó 7, o argumento de retorno de chamada não é mais opcional e resultará em um aviso. Passe uma função vazia se você realmente não se importa.
Jlh