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
#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
#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