Page tree
Skip to end of metadata
Go to start of metadata

Escreve dados de um buffer de string em um arquivo binário. Para isso, pode-se escrever todo ou parte do conteúdo do buffer, limitando a quantidade de bytes.

 

Sintaxe

FWrite( < nHandle >, < cBuffer >, [ nQtdBytes ] )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nHandle

numérico

Indica o manipulador de arquivo obtido através das funções FCreate() e FOpen().

X

 

cBuffer

caractere

Indica a string que será escrita no arquivo especificado. O tamanho desta variável deve ser maior ou igual ao tamanho informado no parâmetro (caso seja informado o tamanho).

X

 

nQtdBytes

numérico

Indica a quantidade de bytes que serão escritos a partir da posição atual do ponteiro de arquivos. Caso não seja informado, todo o conteúdo do parâmetro é escrito.

 

 

Retorno

Nome

Tipo

Descrição

nRet

numérico

Retorna a quantidade de bytes escritos na forma de um valor numérico inteiro. Caso o valor seja igual ao parâmetro <nQtdBytes>, a operação foi realizada com sucesso; caso contrário, se o valor for menor ou zero, o disco rígido está cheio ou ocorreu erro.

Observações

  • A escrita começa a partir da posição atual do ponteiro de arquivos e a função retorna a quantidade real de bytes escritos.
  • Através das funções FOpen() e FCreate(), pode-se abrir ou criar um arquivo, abrir uma porta de comunicação para gravar ou enviar os dados do buffer informado.
  • Essa função suporta na string, do parâmetro , todos os caracteres da tabela ASCII, inclusive caracteres de controle (ASC 0, ASC 12, ASC 128, etc.).
  • A gravação no arquivo é realizada a partir da posição atual do ponteiro, mas pode ser ajustado através das funções FSeek(), FRead() ou FReadStr().
  • Se o retorno da função for menor que o parâmetro ou zero, o disco rígido está cheio ou ocorreu erro. Neste caso, utilize a função FError() para obter mais detalhes.

Exemplos

Exemplo 1
#include "fileio.ch"

user function exemplo1()

  // Abre o arquivo
  nHandle := fopen('c:\garbage\teste.txt' , FO_READWRITE + FO_SHARED )
  If nHandle == -1
    MsgStop('Erro de abertura : FERROR '+str(ferror(),4))
  Else
    FSeek(nHandle, 0, FS_END)         // Posiciona no fim do arquivo
    FWrite(nHandle, "Nova Linha", 10) // Insere texto no arquivo
    fclose(nHandle)                   // Fecha arquivo
    MsgAlert('Processo concluído')
  Endif

return



Exemplo 2
#INCLUDE "FILEIO.CH"

//Este exemplo realiza uma cópia de um arquivo Texto chamado ORIGEM.TXT, 
//para um arquivo chamado DESTINO.TXT, no ambiente do Servidor de Aplicação.

#DEFINE F_BLOCK 1024    // Define o bloco de Bytes a serem lidos / gravados por vez

user function TestCopy()

  Local cBuffer := SPACE(F_BLOCK)
  Local nHOrigem, nHDestino
  Local nBytesLidos, nBytesFalta, nTamArquivo
  Local nBytesLer, nBytesSalvoLocal
  lCopiaOk := .T.
  // Abre o arquivo de Origem
  nHOrigem := FOPEN("ORIGEM.TXT", FO_READ)
  // Testa a abertura do Arquivo
  If nHOrigem == -1
    MsgStop('Erro ao abrir origem. Ferror = '+str(ferror(),4),'Erro')
    Return .F.
  Endif
  // Determina o tamanho do arquivo de origem
  nTamArquivo := Fseek(nHOrigem,0,2)
  // Move o ponteiro do arquivo de origem para o inicio do arquivo
  Fseek(nHOrigem,0)
  // Cria o arquivo de destino
  nHDestino := FCREATE("DESTINO.TXT", FC_NORMAL)
  // Testa a criação do arquivo de destino
  If nHDestino == -1
    MsgStop('Erro ao criar destino. Ferror = '+str(ferror(),4),'Erro')
    FCLOSE(nHOrigem)  // Fecha o arquivo de Origem
    Return .F.
  Endif
  // Define que a quantidade que falta copiar é o próprio tamanho do Arquivo
  nBytesFalta := nTamArquivo
  // Enquanto houver dados a serem copiados
  While nBytesFalta > 0
    // Determina quantidade de dados a serem lidos
    nBytesLer := Min(nBytesFalta, F_BLOCK )
    // lê os dados do Arquivo
    nBytesLidos := FREAD(nHOrigem, @cBuffer, nBytesLer )
    // Determina se não houve falha na leitura
    If nBytesLidos < nBytesLer
      MsgStop("Erro de Leitura da Origem. " + Str(nBytesLer,8,2) +;
      " bytes a LER." + Str(nBytesLidos,8,2) + " bytes Lidos." + "Ferror = " + str(ferror(),4),'Erro')
      lCopiaOk := .F.
      Exit
    Endif
    // Salva os dados lidos no arquivo de destino
    nBytesSalvo := FWRITE(nHDestino, cBuffer,nBytesLer)
    // Determina se não houve falha na gravação
    If nBytesSalvo < nBytesLer
      MsgStop("Erro de gravação do Destino. " + Str(nBytesLer,8,2) +;
      " bytes a SALVAR." + Str(nBytesSalvo,8,2) + " bytes gravados." + "Ferror = " + str(ferror(),4),'Erro')
      lCopiaOk := .F.
      EXIT
    Endif
    // Elimina do Total do Arquivo a quantidade de bytes copiados
    nBytesFalta -= nBytesLer
  Enddo
  // Fecha os arquivos de origem e destino
  FCLOSE(nHOrigem)
  FCLOSE(nHDestino)
  If lCopiaOk
    MsgStop('Cópia de Arquivos finalizada com sucesso. ' + str(nTamArquivo,12,0) + ' bytes copiados.','Final')
  Else
    MsgStop('Falha na Cópia. Arquivo de Destino incompleto. ' +;
    'Do total de ' + str(nTamArquivo,12,0) + ' bytes, faltaram ' + str(nBytesFalta,12,0)+' bytes.','Final')
  Endif

return

Veja também

  • No labels