Se a solução acima não funcionar para você, pode ser possível obter o mesmo resultado com o código nodejs puro a seguir. O acima não funcionou para mim e resultou em uma exceção de compilação ao executar nv instalar iconv no OSX: fs. readFileSync () retorna um Buffer se nenhuma codificação for especificada. E Buffer tem um método toString () que irá converter para UTF8 se nenhuma codificação for especificada dando-lhe o conteúdo dos arquivos. Consulte a documentação do nodejs. Isso funcionou para mim. Resposta Estou tentando usar o browser para acessar um arquivo binário local (ou seja, o arquivo binário está no mesmo diretório que o arquivo javascript, que está no computador do usuário). Eu não consegui. Heres o que eu tentei eo que eu sei:) Eu sei fs não vai funcionar. 0) Tentei usar o require (html) mas diz ajax não suportado neste navegador estou usando cromo. Mas eu suponho que é mais ou menos a mesma coisa que o cromo. 1) Tentei usar o browser-request. Isso lê o arquivo binário. Como uma string. É baseado na solicitação para que eu deveria ser capaz de configurar as opções, incluindo a codificação: null, que iria resolver todos os meus problemas, mas. Olhando para o código-fonte. Você verá que não há suporte para a opção de codificação está presente. Nem mesmo um aviso. 2) Eu usei xmlhttprequest, que exigia o módulo html. Novamente, recebo o mesmo erro que em 0) Estranhamente, browser-request usa este módulo e ele funciona. E eu não tenho absolutamente nenhuma idéia por que. 3) Neste ponto, eu olhei para html5 suporte ao sistema de arquivos. Funcionaria mas eu não quero que o usuário especifique um arquivo. Vendo como eu realmente só quero obter o buffer para a memória. Existe alguma outra maneira de acessar o arquivo Talvez usando --allow-file-access ao iniciar cromo 4) Se tudo mais falhar, eu só quero uma maneira de obter o buffer em meu código. Eu acho que eu poderia apenas usar nó no shell e copiar colar o resultado da leitura do arquivo na memória. Existe alguma esperança em todos os Synchronous File IO em Node. js Chamada fs. writeFileSync disparar uma gravação síncrona para o sistema de arquivos Se você estiver familiarizado com Node. js. Ou pelo menos ouvido dele, you39ve ouvido mais provável que usa IO não-bloqueando, e deixa-o trabalhar assincronamente. Uma das APIs mais básicas que o Node fornece é para o sistema de arquivos Com esta API, você pode ler, gravar, remover, etc. arquivos e fazer outras tarefas relacionadas ao sistema de arquivos e modificações. Esta API segue um padrão padrão de expor 2 funções para cada operação: uma para trabalho assíncrono e outra para trabalho síncrono. Por exemplo, se você quiser ler um arquivo no Node, pode fazê-lo de forma assíncrona: O nó continuará executando qualquer código javascript encontrado durante a leitura do arquivo. Uma vez que todo o javascript é feito sendo executado eo arquivo está pronto, ele irá executar a função anônima e imprimir o conteúdo do arquivo. Você pode fazer a mesma tarefa de forma síncrona: neste exemplo, o conteúdo será definido para o conteúdo do arquivo e nenhum código javascript será executado enquanto o arquivo está sendo lido. A primeira abordagem é feita de forma assíncrona e retornará imediatamente para não bloquear o código de execução. O segundo é feito de forma síncrona e interrompe a execução até que a tarefa seja concluída. Os mesmos 2 tipos de funções existem para escrever, renomear, excluir, arquivos etc. Synchronous Writes Então a questão é, não chamar fs. writeFileSync realmente desencadear uma gravação síncrona para o sistema de arquivos No processo userland Node, it39s síncrono no sentido de que a execução de qualquer javascript é interrompido, mas o que acontece no Kernel Uma escrita assíncrona é Uma coisa muito diferente de uma gravação síncrona para um sistema de arquivos. Para o resto do post do blog, falarei no contexto do Kernel Illumos e do Sistema de Arquivos ZFS. Existem algumas maneiras de responder a esta pergunta. A maneira mais óbvia é puxar o código-fonte Node. js, localizar as funções que falam com o sistema de arquivos que fs. js usa e ver como eles são chamados. Eu não fiz muito trabalho no núcleo Node, e sei que poderia (e muito provavelmente iria) levar muito tempo para encontrar o código que eu estava procurando. Em vez disso, I39ll apenas usar DTrace para responder a pergunta, e ver exatamente o que Node está fazendo. DTrace para o Rescue Eu escrevi um par de programas de teste que exercitam essas funções do sistema de arquivos. Usando o DTrace, poderemos ver com quais bandeiras um arquivo é aberto, o que mostrará se as operações são síncronas ou não. Fs. writeFile () Este script exerce o mecanismo assíncrono de escrita de arquivos do Node39s. Usando o DTrace, podemos imprimir as bandeiras que foram passadas para abrir (2) para esse arquivo específico. Em seguida, usando fileflags. Podemos transformar esse decimal em nomes simbólicos que compõem o decimal (ver open (2) para mais informações). O primeiro comando diz ao DTrace para executar o nó writefile. js. E olhar para qualquer um da família aberta de syscalls. Se o primeiro argumento para abrir (o nome do caminho) corresponde ao arquivo para o qual estamos escrevendo, imprima o exato syscall disparado e as flags decimal. Acontece que open64 (2) foi chamado para o nosso arquivo, dado as seguintes opções. OWRONLY. Open write-only OCREAT. Crie o arquivo se ele não existir OTRUNC. Truncar o arquivo Opções razoavelmente padrão para abrir um arquivo. Como nenhuma das opções é para IO síncrono (OSYNC, ODSYNC, etc.), esta gravação de arquivo é assíncrona ao ZFS e a chamada para write (2) retorna antes que os dados sejam garantidos para estar em armazenamento estável. Node39s assíncrono fs. writeFile realmente faz uma assíncrona escrever para o sistema de arquivos. Fs. writeFileSync () Assim que sobre Node39s mecanismo de escrita de arquivo síncrono, é uma gravação síncrona real para o sistema de arquivos Este script irá bloquear o loop de eventos enquanto os dados são escritos para o arquivo (ou assim pensamos), como ele usa Node39s Mecanismo de escrita de arquivo síncrono. Mesmos comandos acima, e a mesma saída. Node39s fs. writeFileSync NÃO inicia uma gravação síncrona no sistema de arquivos. Do ponto de vista de um programa Node, sabemos a mesma coisa quando uma chamada para fs. writeFileSync retorna, como sabemos quando o retorno de chamada para fs. writeFile é acionado. Sabemos que a chamada subjacente, write (2) retornou Nós não sabemos que os dados fizeram isto para armazenamento estável. A única diferença então, é que uma função bloqueia o loop de eventos do Node39s, enquanto a outra permite que ele continue processando eventos. Fs. createWriteStream () Outro mecanismo que permite que o arquivo IO é criar e escrever para um Node WritableStream. Mesmo saída como acima, novamente. Esse mecanismo abre o arquivo com os mesmos sinalizadores como fs. writeFile e fs. writeFileSync. Fs. appendFile () Portanto, escrever em um arquivo usa os mesmos sinalizadores para abrir o arquivo, o que sobre a adição Mesmo broca como acima Então as bandeiras são diferentes, isso é um bom sinal. OTRUNC foi trocado para OAPPEND. Uma vez que não estamos truncando o arquivo para 0 bytes e em vez disso estamos anexando a ele. Novamente, como todos os comandos acima, fs. appendFile abre o arquivo para IO assíncrono. Fs. appendFileSync () Por último mas não menos importante vamos testar a versão síncrona do appendFile. O mesmo que fs. appendFile o arquivo não é aberto para gravações síncronas. Bandeiras comuns Use um programa C simples para abrir um arquivo usando fopen (3C) para ver quais bandeiras ele usa. Em seguida, execute-o com o mesmo comando acima para ver quais bandeiras o arquivo foi aberto com. Com certeza, as mesmas bandeiras como abrir um arquivo para escrever em terra Node. Fs. writeFileSync é síncrono no sentido de que bloqueia o loop de eventos enquanto ele é executado. Ele não pede ao Kernel para fazer uma gravação síncrona para o sistema de arquivos subjacente. Este script irá bloquear o loop de eventos enquanto os dados são gravados no arquivo (ou assim pensamos). Nenhuma das funções acima abrir arquivos para IO síncrono. Devido a isso, tudo o que sabemos é que a chamada para escrever (2) retorna, não que os dados tenham sido gravados no sistema de arquivos e liberado para armazenamento estável. Don39t obter desarmado sobre os nomes, fs. writeSync doesn39t sincronamente escrever para o sistema de arquivos. Se você quiser abrir um arquivo para IO síncrono, você terá que usar as funções fs de nível inferior que o Node oferece como fs. open () e fs. fsync (). Cópia dave eddy ltdavedaveeddygt
No comments:
Post a Comment