Eu tenho tentado encontrar uma maneira de gravar em um arquivo ao usar o Node.js, mas sem sucesso. Como eu posso fazer isso?
1646
Há muitos detalhes na API do sistema de arquivos . A maneira mais comum é:
const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }
Como posso modificar esse script para que funcione fora de/tmp
?/home/...
. Geralmente esse diretório é 755 root: wheel (ou qualquer outra coisa). Se o nó quiser gravar um arquivo como Jane, será mais fácil gravar nele/home/jane/test.txt
. Mudar/home
para algo mais permissivo que 755 é um grande erro./home
diretório, sugeri que ele fosse modificado. Eu sei que isso pode gerar um problema de segurança. Mas bem, se o usuário quiser salvar lá, essa é a solução. PS: Eu concordo com o que você disse (:Atualmente, existem três maneiras de escrever um arquivo:
fs.write(fd, buffer, offset, length, position, callback
)Você precisa aguardar o retorno de chamada para garantir que o buffer seja gravado no disco. Não é armazenado em buffer.
fs.writeFile(filename, data, [encoding], callback)
Todos os dados devem ser armazenados ao mesmo tempo; você não pode executar gravações seqüenciais.
fs.createWriteStream(path, [options]
)Cria um
WriteStream
, o que é conveniente porque você não precisa esperar por um retorno de chamada. Mas, novamente, não é armazenado em buffer.A
WriteStream
, como o nome diz, é um fluxo. Um fluxo por definição é "um buffer" contendo dados que se movem em uma direção (origem ► destino). Mas um fluxo gravável não é necessariamente "armazenado em buffer". Um fluxo é "armazenado em buffer" quando você escreven
horários e, em seguidan+1
, envia o buffer para o kernel (porque está cheio e precisa ser liberado).Em outras palavras: "Um buffer" é o objeto. Se ele é ou não armazenado em buffer é uma propriedade desse objeto.
Se você olhar para o código, o
WriteStream
herda de umStream
objeto gravável . Se você prestar atenção, verá como eles liberam o conteúdo; eles não têm nenhum sistema de buffer.Se você escreve uma string, ela é convertida em um buffer e enviada à camada nativa e gravada no disco. Ao escrever strings, eles não estão preenchendo nenhum buffer. Então, se você fizer:
Voce esta fazendo:
São três chamadas para a camada de E / S. Embora você esteja usando "buffers", os dados não são armazenados em buffer. Um fluxo em buffer faria:,
fs.write(new Buffer ("abc"))
uma chamada para a camada de E / S.A partir de agora, no Node.js. v0.12 (versão estável anunciada em 06/06/2015) agora suporta duas funções:
cork()
euncork()
. Parece que essas funções finalmente permitirão armazenar em buffer / liberar as chamadas de gravação.Por exemplo, em Java, existem algumas classes que fornecem fluxos em buffer (
BufferedOutputStream
,BufferedWriter
...). Se você escrever três bytes, esses bytes serão armazenados no buffer (memória) em vez de fazer uma chamada de E / S por apenas três bytes. Quando o buffer está cheio, o conteúdo é liberado e salvo no disco. Isso melhora o desempenho.Não estou descobrindo nada, apenas lembrando como um acesso ao disco deve ser feito.
fonte
cork()
euncork()
para aqueles de nós que desejam experimentar o nó de pré-lançamento 0.11?npm
implementação de gravação em buffer?Obviamente, você pode torná-lo um pouco mais avançado. Não bloqueando, escrevendo pedaços e partes, não escrevendo o arquivo inteiro de uma só vez:
fonte
Gravação síncrona
Gravação assíncrona
Onde
Vale a pena ler o arquivo oficial do sistema (fs) docs .
fonte
fonte
fs.write()
), este exemplo funciona apenas se tudo for curto o suficiente para ser gravado em uma única chamada de gravação.Eu gostei do Index ./articles/file-system .
Funcionou para mim.
Consulte também Como gravar arquivos no node.js? .
Conteúdo do helloworld.txt:
Atualização:
Como no nó Linux, escreva no diretório atual, parece que em alguns outros não, então eu adiciono este comentário para o caso:
Usando isso
ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
para chegar onde o arquivo está gravado.fonte
As respostas fornecidas são datadas e uma maneira mais recente de fazer isso é:
consulte os documentos aqui para obter mais informações
fonte
(node:23759) ExperimentalWarning: The fs.promises API is experimental
v10.15.0
Eu sei que a pergunta feita sobre "gravação", mas em um sentido mais geral, "anexar" pode ser útil em alguns casos, pois é fácil usar um loop para adicionar texto a um arquivo (se o arquivo existe ou não). Use "\ n" se você quiser adicionar linhas, por exemplo:
fonte
const
vez devar
, ou sejaconst fs = require('fs');
, para evitar efeitos colaterais indesejados, principalmente se você estiver trabalhando com uma base de código um pouco maior.OK, é bastante simples, já que o Node possui funcionalidade interna para isso, é chamado
fs
de File System e, basicamente, o módulo NodeJS File System ...Então, primeiro exija-o no seu arquivo server.js, desta forma:
fs
tem poucos métodos para gravar no arquivo, mas minha maneira preferida é usarappendFile
, isso anexará as coisas ao arquivo e, se o arquivo não existir, criará um, o código pode ser como abaixo:fonte
Por exemplo: leia o arquivo e grave em outro arquivo:
fonte
writeFile
?Você pode gravar em um arquivo usando o módulo fs (sistema de arquivos).
Aqui está um exemplo de como você pode fazer isso:
Você também pode se livrar dessa estrutura de código de retorno de chamada dentro de retorno usando promessas e
async
/await
instruções. Isso tornará a estrutura de código assíncrona muito mais simples. Para fazer isso, pode ser utilizada uma função útil util.promisify (original) . Ele nos permite alternar entre retornos de chamada e promessas. Veja o exemplo com asfs
funções abaixo:fonte
Aqui usamos w + para ler / gravar as duas ações e, se o caminho do arquivo não for encontrado, ele será criado automaticamente.
Conteúdo significa o que você precisa gravar no arquivo e seu comprimento, 'content.length'.
fonte
Aqui está o exemplo de como ler o arquivo csv do local e gravar o arquivo csv no local.
fonte
Depois, lendo este longo artigo. Você deve entender como isso funciona. Então, aqui está um exemplo de
createWriteStream()
.fonte
createWriteStream
já foi mencionado em várias respostas anos antes desta.Você pode usar a biblioteca
easy-file-manager
instale primeiro a partir do npm
npm install easy-file-manager
Exemplo para fazer upload e remover arquivos
fonte
This modules is created to save and remove files.
. Não é uma resposta.Você pode gravar em um arquivo pelo seguinte exemplo de código:
fonte
writeFile
já havia sido dada como resposta várias vezes, anos atrás. O que essa resposta adiciona?