• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

NuGuN

[VB6] Trabalhar com Ficheiros - How To

13 mensagens neste tópico

O que vou aqui explicar é o básico para trabalhar com ficheiros em VB6.

  • Ler/Escrever em ficheiros de texto
  • Ler/Escrever em ficheiros binários
  • Apagar Ficheiros
  • Renomear Ficheiros
  • Verificar a Existência de um determinado Ficheiro

Ficheiros de Texto

Ler

Dim strFicheiro As String

Open "dir ficheiro" For Input As #1
   Line Input #1, strFicheiro
Close #1

"dir ficheiro" -> directório do ficheiro que se pretende abrir

For Input -> indica que vamos abrir o ficheiro apenas para leitura

#1 -> é como um identificador para o ficheiro

Line Input #1, strFicheiro -> carrega a informação para dentro da variável strFicheiro

Close #1 -> Ao abrir o ficheiro este fica a ser utilizado pelo programa e não é possível apaga-lo enquanto não for fechado no programa o ficheiro

O código a cima lê a primeira linha de um ficheiro de texto e carrega essa informação para a variável strFicheiro. A cada vez que se executa a linha Line Input #1, strFicheiro será lida a linha seguinte. Se quisermos ler apenas as 2 primeiras linhas de um ficheiro de texto podemos colocar duas linhas Line Input #1, strFicheiro seguidas:

Dim strFicheiro As String
Dim temp As String

Open "dir ficheiro" For Input As #1
   Line Input #1, temp
   strFicheiro = temp
   Line Input #1, temp
   strFicheiro = strFicheiro & temp
Close #1

Ao tentarmos ler uma linha inexistente ou seja, se no ficheiro de texto não existir mais linhas para ler e se tentarmos ler mais linhas irá dar erro. Não esquecer que uma linha em branco é diferente de uma linha inexistente.

Este método serve se quisermos apenas ler 1, 2 ou 3 linhas mas, se quisermos ler um ficheiro de texto completo com por exemplo 100 linhas não vamos repetir 100 vezes a mesma linha de código. Para contornar este problema utilizamos um ciclo while:

Open "dir ficheiro" For Input As #1
   While EOF(1)
       Line Input #1, temp
       strFicheiro = strFicheiro & temp
   Loop
Close #1

While EOF(1) -> inicio do ciclo while. EOF ou End Of File (em português "Fim Do Ficheiro") ou seja, repete o ciclo enquanto não chegar ao fim do ficheiro de texto. O 1(um) da linha EOF(1) não tem a função de indicar se a expressão é verdadeira ou falsa. Indica que o ciclo vai acabar quando chegar ao fim do ficheiro 1, porque abrimos o ficheiro com o marcador 1 (Open "dir ficheiro" For Input As #1). Não é obrigatório ser sempre utilizado o numero 1. Se quisermos ler 2 ficheiro e não os fechar imediatamente a seguir a termos lido a informação, teremos de mudar de marcador para os diferentes ficheiros. Se por exemplo não tivesse fechado o ficheiro com o marcador 1 e quisesse abrir outro ficheiro para ler ou escrever teria de utilizar outro marcador em vez do 1:

Open "dir ficheiro" For Input As #2
   Line Input #2, strFicheiro
Close #2

Quando falo em "não fechar um ficheiro" refiro-me a não utilizar a linha Close #2, e enquanto não a utilizar este ficheiro ira estar a a ser utilizado pelo programa. Isto serve para um ficheiro que é utilizado várias vezes durante a execução de um programa. Como é utilizado várias vezes, o ficheiro é aberto por exemplo no evento Form_Load e não mais é fechado ate o programa terminar. Isto evita que para ler ou escrever no ficheiro tenhamos que andar sempre a escrever todo aquele código. Assim se o ficheiro estiver aberto basta a linha Line Input #2, strFicheiro.

Escrever

Open "dir ficheiro" For Output As #1
   Print #1, strFicheiro
   'ou
   Write #1, strFicheiro
Close #1

For Output -> indica que vamos abrir um ficheiro para escrita

Print #1, strFicheiro -> Escreve no ficheiro de texto o que estiver na variável strFicheiro

Write #1, strFicheiro -> Escreve no ficheiro de texto o que estiver na variável strFicheiro, com a diferença de colocar entre aspas o que escreve. Imaginemos que a variável continha a string Frase Teste, esta string seria passada para o ficheiro de texto assim -> "Frase Teste"

O código acima serve para escrevermos num ficheiro de texto. Ao abrirmos o ficheiro com a linha Open "dir ficheiro" For Output As #1 ele criará o ficheiro caso ele não exista ou, caso exista o que estiver dentro dele será eliminado e ficará em branco.

Open "dir ficheiro" For Append As #1
   Print #1, strFicheiro
   'ou
   Write #1, strFicheiro
Close #1

Este código serve para escrever em ficheiro de texto como o anterior com a diferença de dar para adicionar texto a ficheiros já existentes e com informação. Com este código acrescenta-se no final do ficheiro a informação desejada. A nível de código a diferença esta no modo com que se abre o ficheiro (For Append)

Ficheiros Binários

Ler

Dim strFicheiro() As Byte
Dim iFreeFile As Long

iFreeFile = FreeFile

ReDim strFicheiro(tamanho_ficheiro)
Open "dir ficheiro" For Binary Access Read As #iFreeFile
   Get #iFreeFile, 1, strFicheiro
Close #iFreeFile

iFreeFile = FreeFile -> para ficheiro binários, antes de abrirmos o ficheiro temos de reservar espaço em memória para o armazenar

ReDim strFicheiro(5) -> redimensiona a variável com o tamanho do ficheiro a abrir

Get #iFreeFile, 1, strFicheiro -> coloca-se o conteúdo do ficheiro na variável strFicheiro. O "1" indica em que posição começar a ler o ficheiro.

Este metodo de ler ficheiro binários é mais utilizada para ser ter um maior controlo pois o programador pode escolher partes do ficheiro que queria carregar, em vez de carregar o ficheiro completo uma vez que define o tamanho da variável e o ponto de inicio de leitura.

Dim strFicheiro As String
Dim iFreeFile As Long

iFreeFile = FreeFile

Open "dir ficheiro" For Binary Access Read As #iFreeFile
   strFicheiro = Input(LOF(iFreeFile), iFreeFile)
Close #iFreeFile

strFicheiro = Input(LOF(iFreeFile), iFreeFile) -> carrega-se o ficheiro para a variável strFicheiro como tamanho que se desejar. LOF() ou Lenght Of File que significa comprimento/tamanho do ficheiro, essa função retorna o tamanho do ficheiro. Se por exemplo se quizer apenas carregar os primeiros 8 bytes do ficheiro troca-se LOF(iFreeFile) por 8 e seriam apenas os primeiros 8 bytes carregados para a variável strFicheiro.

Escrever

Dim strFicheiro As String
Dim iFreeFile As Long

iFreeFile = FreeFile

strFicheiro = "string teste"

Open "dir ficheiro" For Binary Access Write As #iFreeFile
   Put #iFreeFile, 1, strFicheiro
Close #iFreeFile

Com este código escreve-se para um ficheiro binário. O "1" indica onde se deve começar a escrever no ficheiro. Se por exemplo o programador colocar "1" como esta acima e se existir informação nesse ficheiro, essa informação será substituída, exemplo:

Antes: "1234567"

Escreve-se no ficheiro a string "teste" com a linha -> Put #iFreeFile, 1, strFicheiro

Depois: "teste67"

Se quiser inserir no fim do ficheiro basta trocar o numero por LOF(iFreeFile), ficando assim: Put #iFreeFile, LOF(iFreeFile), strFicheiro

Como por vezes é necessário ler e escrever para um ficheiro em simultâneo, não dá muito geito andar a abrir o ficheiro em modo de leitura, abrir o ficheiro em modo escrita e sempre assim... por isso pode-se fazer o seguinte:

Dim strFicheiro As String
Dim varLeitura() As Byte
Dim iFreeFile As Long

iFreeFile = FreeFile

strFicheiro = "string teste"

ReDim varLeitura(tamanho_ficheiro)

Open "dir ficheiro" For Binary As #iFreeFile
   Put #iFreeFile, 1, strFicheiro
   Get #iFreeFile, 1, varLeitura
Close #iFreeFile

Basta retirar Binary Access Write ou Binary Access Read, e assim pode-se ler e/ou escrever.

Apagar Ficheiros

Kill "dir ficheiro"

bem.. não ha muito a dizer sobre esta linha... quando se tenta apagar um ficheiro que não existe dá erro, portanto pode-se adicionar mais uma linha para evitar que dê erro e o consequente encerramento do processo:

On Error Resume Next
Kill "dir ficheiro"

Renomear Ficheiros

Name "nome_antigo" As "novo_nome"

Tal como a linha anterior caso o ficheiro não exista pode ocorrer erro, por isso será melhor adicionar mais uma linha para evitar problemas....

Verificar a Existência de um determinado Ficheiro

If Dir("dir ficheiro") = "nome_ficheiro" Then
   'Codigo aqui
End If

Para evitar os erros falados nas duas linha de código anteriores, podemos utilizar este código a acompanha-las em vez do On Error Resume Next. Na minha opinião é uma forma mais "proficional" de o fazer.

"dir ficheiro" será trocado pelo directório do ficheiro e o respectivo nome do ficheiro que se quer verificar a existência: "c:\teste.exe"

"nome_ficheiro" será trocado por exemplo por teste.exe. Caso o ficheiro não exista a função Dir() não irá retornar nenhum valor, caso exista retorna o nome do ficheiro.

NOTA

Na minha opinião quando se esta a trabalhar com ficheiros nunca se sabe o que pode acontecer ou o que os utilizadores fazem, por isso aconselho a utilizarem sempre nas funções onde estão a trabalhar com ficheiros, que coloquem a linha de código On Error Resume Next

E é tudo (pelo menos o que eu considero básico :D). Alguma dúvida, já sabem.... não hesitem em perguntar ;)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva

Supondo que eu quero criar um ficheiro de texto onde vá escrever dados relativos a uma pessoa.

Esses dados estariam organizados por

numero  nome  telefone

cada um destes campo faz parte de uma estrutura.

Quando abro o ficheiro em Random, se usar o

Put #file, , estrutura

A formataçao dos dados é esquesita, pois entre cada campo da estrutura é colocado um quadrado.

Se abrir em Append posso imprimir campo a campo, mas um dos objectivos era verificar se o numero da pessoa já exisrte na linha.

Em suma.

se usar o random, há algumna maneira de imprimir os campos sem aquele quadrado e já agora é possivel percorrer o ficheirop á procura do numero?

obrigado e desculpem...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

Eu não sei a origem da informação que guardas no ficheiro de texto, mas normalmente esses "quadradinhos" aparecem onde seria para estar um parágrafo, o equivalente a um "Enter", não sei se é o caso.

Quando falas em Random, a que te referes?

e já agora é possivel percorrer o ficheirop á procura do numero?

Sim é ;)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites


Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
Put #2, , estrutura(1, 2)
Close #2

Estrutura:

Type tRec
Id As String
Channel As String
End Type

o resultado no ficheiro bb.txt é o seguinte

  [] 3  []Sensor

Os dois campos que mandei imprimir tem o conteudo correcto, mas o raio dos quadrados é que nao estao lá a fazer nada.

Tambem posso usar a abertura de ficheiro do tipo APPEND, mas aí nao consigo imprimir a estrutura toda de uma so vez e cada campo da estrutura fica numa linha diferente.

O que eu queria era que dada a estrutura a info ficasse da seguinte maneira no txt

Id__channel__[outra campos]

1      5              .....

6      7                .....

não sei como fazer para que a info fique formatada assim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como já disse esses quadrados são devido a um paragrafo com um formato esquisito (não sei a razão). Então e se utilizares output em vez de Random? O ramdom nem sabia de exitir....

Atenção que ao abrires o ficheiro em modo output, o que esta no ficheiro desaparece....

Se queres que essa estrotura apareça em linha então tens de ver a origem dessa estrutura. Ele só por si não coloca esses parágrafos.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, podiam me informar como abrir um ficheiro mas apartir do ficheiro e nao de um programa....

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, podiam me informar como abrir um ficheiro mas apartir do ficheiro e nao de um programa....

Cumprimentos

Hum ? A partir de um ficheiro como ? Duplo clique nele e chamar a aplicação que o lê ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ola é o seguinte, tenho um ficheiro  .txt ja com informaçao dentro dele, e ao mandar escrever mais informaçao ele vai subestituir as linhas, e perder a informaçao antiga..

ou seja eu preciso mesmo saber é como posso dizer para ele por exemplo começar a escrever na linha 4, em vez de começar a escrever no inicio, como pulo linhas sem as apagar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal ler o tutorial  :D

Open "dir ficheiro" For Append As #1

    Print #1, strFicheiro

    'ou

    Write #1, strFicheiro

Close #1

Este código serve para escrever em ficheiro de texto como o anterior com a diferença de dar para adicionar texto a ficheiros já existentes e com informação. Com este código acrescenta-se no final do ficheiro a informação desejada. A nível de código a diferença esta no modo com que se abre o ficheiro (For Append)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites


Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
Put #2, , estrutura(1, 2)
Close #2

Para leres do ficheiro no formato correcto usas

Open "c:\bb.txt" For Random As #2 'Len = Len(rt)
get #2, , estrutura(1, 2) ' só tens de "dizer" que queres o get em vez do put 
Close #2

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E como fazer para não repetir os dados do arquivo em txt para que ele só seja exibido uma vez . EX: num arquivo em txt, tem 5 paginas e quero que exiba somente uma vez a data q aparece nas 5 páginas???

Open "C:\ABONO09.txt" For Input As #1

 Line Input #1, linha
 Do While Not EOF(1) 'ler até o final do arquivo
 If UCase(Mid(linha, 34, 11)) = "OCORRENCIAS" Then ' se na linha tiver a palavra ocorrencia então imprimi as data1 e data2
 data1 = Mid(linha, 60, 8)
 data2 = Mid(linha, 71, 8)
 Print "Data: "; data1; " "; "à" & " "; data2; vbCrLf ' o caracter "&" substitui o ";" e o vbcrlf pula uma linha
 End If

bjs hk

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora