No nó, o módulo fs refere-se ao "módulo do sistema de arquivos", que é um módulo usado para operar arquivos. A maioria das APIs do módulo fs fornece três métodos operacionais: 1. Operação de arquivo síncrona: o código será bloqueado e não continuará a ser executado 2. Arquivo de operação de função de retorno de chamada assíncrona: o código não será bloqueado e uma função de retorno de chamada precisa ser; passado. Quando o resultado é gerado, a função de retorno de chamada é executada 3. Arquivo de operação de promessa assíncrona: o código não será bloqueado e uma promessa será retornada chamando a operação do método por meio de fs.promises.
O ambiente operacional deste tutorial: sistema Windows 7, nodejs versão 16, computador DELL G3.
O módulo do sistema de arquivos (abreviadamente fs) nos permite acessar e interagir com o sistema de arquivos em nosso computador.
O módulo fs é um módulo fornecido oficialmente pelo Node.js para operar arquivos. Ele fornece uma série de métodos e propriedades para atender às necessidades de operação de arquivos dos usuários.
Método fs.readFile(), usado para ler o conteúdo do arquivo especificado
Método fs.writeFile(), usado para gravar conteúdo no arquivo especificado se você quiser usá-lo em código JavaScript
O módulo do sistema de arquivos é um módulo principal do Node.js. Isso significa que não precisamos instalá-lo. A única coisa que precisamos fazer é importar o módulo fs para seu próprio arquivo.
Então, no topo do arquivo, adicione:
const fs = requer('fs')Agora podemos chamar qualquer método do módulo do sistema de arquivos usando o prefixo fs.
Alternativamente, podemos simplesmente importar os métodos necessários da API fs da seguinte forma:
const {writeFile, readFile} = require('fs')Nota: Por conveniência, também precisamos importar o módulo path. É outro módulo principal do Node.js que nos permite trabalhar com caminhos de arquivos e diretórios.
Após importar o módulo fs, adicione:
const caminho = require('caminho')Ao usar o módulo do sistema de arquivos, o módulo path não é necessário. Mas isso nos ajuda muito!
As operações de arquivo do módulo fs geralmente suportam duas APIs: síncronas e assíncronas. Assíncronas também incluem funções de retorno de chamada e formulários promsie. A sincronização geralmente é seguida pela palavra sincronização.
A maioria das APIs do módulo fs fornece três métodos de operação:
Operação síncrona de arquivos: o código será bloqueado e não continuará em execução
Arquivo de operação de função de retorno de chamada assíncrona: o código não será bloqueado, a função de retorno de chamada precisa ser passada e, quando o resultado for obtido, a função de retorno de chamada será executada
Arquivos de operação de promessa assíncrona: o código não será bloqueado. Chamar operações de método por meio de fs.promises retornará uma promessa, que pode ser processada por meio de then e catch.
Observe que todos os métodos fs são assíncronos por padrão. Porém, podemos usar a versão sincronizada adicionando Sync no final do método.
Por exemplo, a versão síncrona do método writeFile é writeFileSync. Os métodos síncronos completam o código de forma síncrona, bloqueando o thread principal. Bloquear o thread principal no Node.js é considerado uma má prática e não devemos fazê-lo.
Portanto, a seguir usaremos os métodos assíncronos no módulo do sistema de arquivos.
Para gravar em um arquivo de um aplicativo Node.js, use o método writeFile.
O método writeFile aceita pelo menos os seguintes parâmetros:
Retorno de chamada de conteúdo de nome de arquivoSe o arquivo especificado já existir, ele substituirá o conteúdo antigo pelo conteúdo fornecido como argumento. Se o arquivo especificado não existir, um novo arquivo será criado.
Após importar os módulos fs e path, escreva o seguinte código no arquivo:
fs.writeFile('content.txt', 'Todo trabalho e nenhuma diversão fazem de Jack um garoto chato!', err => { if (err) throw err process.stdout.write('Criado com sucesso!')})O código acima criará um novo arquivo chamado content.txt e adicionará o texto Todo trabalho e nenhuma diversão fazem de Jack um garoto chato como conteúdo! Se houver algum erro, a função de retorno de chamada lançará esse erro. Caso contrário, será exibido no console que o arquivo foi criado com sucesso.
Existem outras variações de writeFile, como:
fs.writeFileSync — Grava arquivos de forma síncrona fsPromises.writeFile — Grava arquivos usando API baseada em PromiseConfira esta essência: https://gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92
Antes de ler um arquivo, o caminho para o arquivo precisa ser criado e armazenado. O caminho do módulo path é conveniente aqui.
Usando o método path do módulo join, você pode criar um caminho de arquivo da seguinte maneira:
const filePath = path.join(process.cwd(), 'content.txt')O primeiro parâmetro process.cwd() retorna o diretório de trabalho atual. Agora que você tem o caminho do arquivo, pode ler o conteúdo do arquivo.
Escreva o seguinte código no arquivo:
fs.readFile(filePath, (erro, conteúdo) => { if (erro) lançar erro process.stdout.write(conteúdo)})O método readFile aceita pelo menos dois parâmetros:
Retorno de chamada do caminho do arquivoSe houver um erro, ocorrerá um erro. Caso contrário, imprime o conteúdo do arquivo no terminal.
Existem outras variações de readFile, como:
fs.readFileSync — Grava em um arquivo de forma síncrona fsPromises.readFile — Grava em um arquivo usando uma API baseada em PromiseConfira esta essência: https://gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d
Exibir um arquivo em um diretório é muito semelhante à leitura do conteúdo do arquivo. Porém, em vez de passar o caminho do arquivo, passe o diretório de trabalho atual (podemos passar qualquer outro diretório).
Em seguida, passe uma função de retorno de chamada para tratar a resposta. Escreva o seguinte código no arquivo:
fs.readdir(process.cwd(), (erro, arquivos) => { if (erro) lançar erro console.log(arquivos)})Até agora, usamos apenas process.stdout.write para enviar conteúdo para o terminal. No entanto, você pode simplesmente usar console.log, como no trecho de código acima.
Se executarmos o aplicativo, devemos obter um array contendo todos os arquivos do diretório.
Confira esta essência: https://gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e
O módulo do sistema de arquivos possui um método que permite excluir arquivos. No entanto, é importante observar que isso funciona apenas para arquivos, não para diretórios.
Quando o método unlink é chamado com um caminho de arquivo como parâmetro, ele exclui o arquivo. Adicione o seguinte trecho de código ao arquivo:
fs.unlink(filePath, error => { if (error) throw error console.log('Arquivo foi excluído!')})Se você executar o código novamente, seus arquivos serão excluídos!
Confira esta essência: https://gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e
Podemos criar um diretório de forma assíncrona usando o método mkdir. Escreva o seguinte código no arquivo:
fs.mkdir(`${process.cwd()}/myFolder/secondFolder`, { recursivo: true }, (err) => { if (err) throw err console.log('Pasta criada com sucesso!') })Primeiro, crie uma nova pasta no diretório de trabalho atual. Conforme mencionado antes, você pode obter o diretório de trabalho atual do objeto de processo usando o método cwd().
Em seguida, passe a pasta ou pastas a serem criadas. No entanto, isso não significa que você precise criar uma nova pasta no diretório de trabalho atual. Você pode criá-los em qualquer lugar.
Agora, o segundo parâmetro é a opção recursiva. Se não estiver definido como verdadeiro, várias pastas não poderão ser criadas. Se a opção recursiva for definida como falsa, o código acima apresentará um erro. Experimente!
Porém, se você deseja apenas criar uma pasta, não há necessidade de definir a opção recursiva como verdadeira.
O código a seguir funciona bem!
fs.mkdir(`${process.cwd()}/myFolder`, err => { if (err) throw err console.log('Pasta criada com sucesso!')});Portanto, gostaria de enfatizar o uso da recursividade. Você precisa definir isso como verdadeiro se quiser criar pastas dentro de pastas. Ele criará todas as pastas, mesmo que elas não existam.
Por outro lado, se quiser apenas criar uma pasta, pode deixá-la falsa.
Confira esta essência: https://gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066
A lógica para excluir um diretório é semelhante à criação de um diretório. Se você observar o código escrito para criar o diretório e o código abaixo, verá semelhanças.
Então escreva o seguinte código no arquivo:
fs.rmdir(`${process.cwd()}/myFolder/`, { recursivo: true }, err => { if (err) throw err console.log('Pasta excluída com sucesso!')})Use o método rmdir do módulo do sistema de arquivos e passe os seguintes parâmetros:
Diretório a ser excluído retorno de chamada de propriedade recursivaSe a propriedade recursiva for definida como verdadeira, ela exclui a pasta e seu conteúdo. É importante observar que você precisa definir isso como verdadeiro se a pasta contiver conteúdo. Caso contrário, você receberá um erro.
O seguinte trecho de código só funciona quando a pasta está vazia:
fs.rmdir(`${process.cwd()}/myFolder/`, err => { if (err) throw err console.log('Pasta excluída com sucesso!')})Se houver outros arquivos e/ou pastas em myFolder, ocorrerá um erro se { recursive: true } não for passado.
É importante saber quando usar a opção recursiva e quando não para evitar problemas.
Confira esta essência: https://gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce
Usando o módulo fs, você pode renomear diretórios e arquivos. O trecho de código a seguir mostra como fazer isso usando o método rename.
// Renomeie um diretório fs.rename(`${process.cwd()}/myFolder/secondFolder`, `${process.cwd()}/myFolder/newFolder`, err => { if (err) throw err console .log('Renomear diretório!')});//Renomear um arquivo fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile .txt` , err => { if (err) throw err console.log('Arquivo renomeado!')});O método rename contém três parâmetros:
O primeiro parâmetro é a pasta/arquivo existente e o segundo parâmetro é o novo nome de retorno de chamadaPortanto, para renomear um arquivo ou diretório, precisamos passar o nome do arquivo/diretório atual e o novo nome. Após executar a aplicação, os nomes dos diretórios/arquivos deverão ser atualizados.
Observe que se o novo caminho já existir (por exemplo, um novo nome para um arquivo/pasta), ele será substituído. Portanto, certifique-se de não substituir arquivos/pastas existentes por engano.
Confira esta essência: https://gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e
Também podemos adicionar novo conteúdo a um arquivo existente usando o método appendFile.
Se compararmos os dois métodos writeFile e appendFile, podemos ver que eles são semelhantes. Passe o caminho do arquivo, conteúdo e retorno de chamada.
fs.appendFile(filePath, 'nTodo trabalho e nenhuma diversão fazem de Jack um garoto chato!', err => { if (err) throw err console.log('Todo trabalho e nenhuma diversão fazem de Jack um garoto chato!')} )O trecho de código acima demonstra como adicionar novo conteúdo a um arquivo existente. Se você executar o aplicativo e abrir o arquivo, deverá ver o novo conteúdo dentro dele.