Como ler e escrever em arquivo usando JavaScript?

Alguém pode dar algum código de exemplo para ler e gravar um arquivo usando JavaScript?

Para completar, o OP não afirma que está procurando fazer isso em um navegador (se ele é, como foi dito, geralmente não é possível)

No entanto, o javascript per se permite isso; isso pode ser feito com o javascript do lado do servidor.

Veja esta documentação na class de arquivo Javascript

Edit : Esse link foi para os documentos da Sun que agora foram movidos pela Oracle.

Para acompanhar os tempos, aqui está a documentação do node.js para a class FileSystem: http://nodejs.org/docs/latest/api/fs.html

Edit (2) : Você pode ler arquivos do lado do cliente agora com HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Não. O javascript do lado do navegador não tem permissão para gravar na máquina cliente sem que muitas opções de segurança tenham que ser desativadas

aqui está a proposta do mozilla

http://www-archive.mozilla.org/js/js-file-object.html

isso é implementado com um switch de compilation no spidermonkey e também no extendscript do adobe. Além disso (eu acho) você obtém o object File em extensões do firefox.

rinoceronte tem uma function readFile (bastante rudimentar) https://developer.mozilla.org/en/Rhino_Shell

para operações de arquivo mais complexas no rinoceronte, você pode usar os methods java.io.File.

você não vai conseguir nada disso no navegador. Para funcionalidade semelhante em um navegador, você pode usar as funções de database SQL de HTML5, persistência de clientes, cookies e objects de armazenamento flash.

O futuro está aqui! As propostas estão mais próximas da conclusão, não mais ActiveX ou flash ou java. Agora podemos usar:

  • APIs do sistema de arquivos

  • Acesso a arquivos arrastar e soltar nativos

Você pode usar o Arrastar / Soltar para colocar o arquivo no navegador ou um simples controle de upload. Depois que o usuário selecionou um arquivo, você pode lê-lo com Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Esta function Javascript apresenta uma checkbox de diálogo “Salvar como” completa para o usuário que a executa através do navegador. O usuário pressiona OK e o arquivo é salvo.

Edit: O código a seguir só funciona com o IE Browser, uma vez que o Firefox eo Chrome consideraram este código um problema de segurança e o impediu de funcionar.

 // content is the data you'll write to file
// filename is the filename
// what I did is use iFrame as a buffer, fill it up with text function save_content_to_file(content, filename) { var dlg = false; with(document){ ir=createElement('iframe'); ir.id='ifr'; ir.location='about.blank'; ir.style.display='none'; body.appendChild(ir); with(getElementById('ifr').contentWindow.document){ open("text/plain", "replace"); charset = "utf-8"; write(content); close(); document.charset = "utf-8"; dlg = execCommand('SaveAs', false, filename+'.txt'); } body.removeChild(ir); } return dlg; }

Invoque a function:

 save_content_to_file("Hello", "C:\\test"); 

Se você estiver usando o JScript (JavaScript da Microsoft) para executar scripts locais usando o WSH (NÃO em um navegador!), Poderá usar o Scripting.FileSystemObject para acessar o sistema de arquivos.

Eu acho que você pode acessar o mesmo object no IE se você desativar muitas configurações de segurança, mas isso seria uma idéia muito, muito ruim.

MSDN aqui

Para o Firefox:

 var file = Components.classs["@mozilla.org/file/local;1"]. createInstance(Components.interfaces.nsILocalFile); file.initWithPath("/home"); 

Veja https://developer.mozilla.org/pt-BR/docs/Code_snippets/File_I_O

Para outros, confira o aplicativo TiddlyWiki para ver como isso acontece.

No contexto do navegador, o Javascript pode ler o arquivo especificado pelo usuário. Veja o blog de Eric Bidelman para detalhes sobre a leitura de arquivos usando o File API. No entanto, não é possível que o Javascript baseado em navegador ESCREVA o sistema de arquivos do computador local sem desabilitar algumas configurações de segurança, pois é considerado uma ameaça à segurança de qualquer site alterar seu sistema de arquivos local arbitrariamente.

Dizendo isso, há algumas maneiras de contornar isso, dependendo do que você está tentando fazer:

  1. Se for seu próprio site, você pode incorporar um Applet Java na página da web. No entanto, o visitante precisa instalar o Java na máquina local e será alertado sobre o risco de segurança. O visitante deve permitir que o applet seja carregado. Um Applet Java é como um software executável que tenha access completo ao computador local.

  2. O Google Chrome suporta um sistema de arquivos que é uma parte de área restrita do sistema de arquivos local. Veja esta página para detalhes. Isso possibilita que você salve temporariamente as coisas localmente. No entanto, isso não é suportado por outros navegadores.

  3. Se você não está limitado ao navegador, o Node.js tem uma interface de sistema de arquivos completa. Veja aqui a documentação do seu sistema de arquivos . Observe que o Node.js pode ser executado não apenas em servidores, mas também em qualquer computador cliente, incluindo o Windows. O corredor de testes de javascript Karma é baseado no Node.js. Se você apenas gosta de programar em javascript no computador local, esta é uma opção.

Atualmente, os arquivos podem ser gravados e lidos a partir do contexto de uma guia / janela do navegador com as APIs File , FileWriter e FileSystem , embora haja ressalvas quanto ao seu uso (veja o final desta resposta).

Mas para responder sua pergunta:

Usando BakedGoods *

Escreva o arquivo:

 bakedGoods.set({ data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} }); 

Leia o arquivo:

 bakedGoods.get({ data: ["testFile"], storageTypes: ["fileSystem"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(resultDataObj, byStorageTypeErrorObj){} }); 

Usando as APIs File, FileWriter e FileSystem brutas

Escreva o arquivo:

 function onQuotaRequestSuccess(grantedQuota) { function saveFile(directoryEntry) { function createFileWriter(fileEntry) { function write(fileWriter) { var dataBlob = new Blob(["Hello world!"], {type: "text/plain"}); fileWriter.write(dataBlob); } fileEntry.createWriter(write); } directoryEntry.getFile( "testFile", {create: true, exclusive: true}, createFileWriter ); } requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess); 

Leia o arquivo:

 function onQuotaRequestSuccess(grantedQuota) { function getfile(directoryEntry) { function readFile(fileEntry) { function read(file) { var fileReader = new FileReader(); fileReader.onload = function(){var fileData = fileReader.result}; fileReader.readAsText(file); } fileEntry.file(read); } directoryEntry.getFile( "testFile", {create: false}, readFile ); } requestFileSystem(Window.PERSISTENT, grantedQuota, getFile); } var desiredQuota = 1024 * 1024 * 1024; var quotaManagementObj = navigator.webkitPersistentStorage; quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess); 

Apenas o que você pediu certo? Talvez talvez não. As duas últimas das APIs:

  • Atualmente, são implementados apenas em navegadores baseados no Chromium (Chrome e Opera)
  • Foram removidos da faixa de padrões do W3C e, a partir de agora, são APIs proprietárias
  • Pode ser removido dos navegadores de implementação no futuro
  • Restringir a criação de arquivos a um sandbox (um local fora do qual os arquivos podem produzir nenhum efeito) no disco

Além disso, a especificação FileSystem não define diretrizes sobre como as estruturas de diretório devem aparecer no disco. Nos navegadores baseados no Chromium, por exemplo, o sandbox tem um sistema de arquivos virtual (uma estrutura de diretórios que não existe necessariamente no disco da mesma forma que quando acessados ​​a partir do navegador), dentro do qual os diretórios e arquivos criados com o APIs são colocadas.

Portanto, embora você possa gravar arquivos em um sistema com as APIs, a localização dos arquivos sem as APIs (bem, sem a API FileSystem) poderia ser um assunto não trivial.

Se você puder lidar com esses problemas / limitações, essas APIs são praticamente a única maneira nativa de fazer o que você pediu.

Se você estiver aberto a soluções não-nativas, o Silverlight também permite a input / saída de arquivos de um concurso de guia / janela através do IsolatedStorage . No entanto, o código gerenciado é necessário para utilizar esse recurso; uma solução que requer escrever tal código está além do escopo desta questão.

Naturalmente, uma solução que faz uso de código gerenciado complementar, deixando um com apenas Javascript para escrever, está bem dentro do escopo desta questão;):

 //Write file to first of either FileSystem or IsolatedStorage bakedGoods.set({ data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}], storageTypes: ["fileSystem", "silverlight"], options: {fileSystem:{storageType: Window.PERSISTENT}}, complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} }); 

* BakedGoods é uma biblioteca Javascript que estabelece uma interface uniforme que pode ser usada para conduzir operações de armazenamento comuns em todas as instalações de armazenamento nativas e algumas não nativas. É mantido por esse cara bem aqui:).

Para criar um arquivo tente

 function makefile(){ var fso; var thefile; fso = new ActiveXObject("Scripting.FileSystemObject"); thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true); thefile.close() } 

Crie o seu diretório na unidade C, porque o Windows tem segurança contra escrita da web, por exemplo, criar uma pasta chamada “tmp” na unidade C.

Você não pode fazer isso de qualquer maneira cross-browser. O IE tem methods para permitir que aplicativos “confiáveis” usem objects ActiveX para ler / gravar arquivos, mas isso é, infelizmente.

Se você deseja salvar informações do usuário, provavelmente precisará usar cookies.

Você terá que recorrer ao Flash, Java ou Silverlight. No caso do Silverlight, você verá o armazenamento isolado . Isso fará você gravar arquivos no seu próprio playground no disco do usuário. Não vai deixar você escrever fora do seu playground.

Você não pode fazer o arquivo I / O no lado do cliente usando javascript, pois isso seria um risco de segurança. Você teria que fazê-los baixar e executar um exe, ou se o arquivo está no seu servidor, use AJAX e uma linguagem do lado do servidor como PHP para fazer o i / o no serverside

Aqui está a solução de gravação para o chrome v52 + (o usuário ainda precisa selecionar um destino doe …)
fonte: StreamSaver.js

    
 const writeStream = streamSaver.createWriteStream('filename.txt') const encoder = new TextEncoder let data = 'a'.repeat(1024) let uint8array = encoder.encode(data + "\n\n") writeStream.write(uint8array) // must be uInt8array writeStream.close() 

Mais adequado para escrever grandes dados gerados no lado do cliente.
Caso contrário, sugiro usar o FileSaver.js para salvar o Blob / Files