Ir para conteúdo
Fórum Script Brasil
  • 0

Arquivos


Andersonjb

Pergunta

E ai pessoal, alguém poderia me ajudar com manipulação de arquivos? Bem, eu consigo ler os arquivos, so que não consigo ler eles por completo, so le a metade do arquivo e nunca le a primeira letra. Bem, meu codigo e esse:

Imports System.IO
Imports System.Windows.Forms
    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private arquivoentrada As FileStream
        Private binarioentrada As BinaryReader


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 

System.EventArgs) Handles Button1.Click
        Dim abrir As OpenFileDialog = New OpenFileDialog
        Dim resultado As DialogResult = abrir.ShowDialog
        Dim nomearq As String = abrir.FileName
        If resultado = DialogResult.Cancel Then
            Return
        End If
        arquivoentrada = New FileStream(nomearq, FileMode.Open, 

FileAccess.Read)
        binarioentrada = New BinaryReader(arquivoentrada)
        RichTextBox1.Text = binarioentrada.ReadString
    End Sub
End Class

alguém poderia me ajudar???

Link para o comentário
Compartilhar em outros sites

  • Respostas 102
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0
Sim, e para exibir arquivos binarios, e que eu nunca mexi com arquivos desse tipo. E um arquivo que dentro dele os textos estao gravados em binario, sabe?

Arquivos são sequências de bytes. Portanto, arquivos binários são sequências de bytes. E arquivos texto *também*. A diferença é que arquivos textos não admitem todos os tipos de bytes, e alguns possuem características especiais. Enquanto em um arquivo binário puro um chr(13) seguido por um chr(10) são apenas dois caracteres, em um arquivo texto isso constituí um avanço de linha mais um retorno de carro. A RichTextBox e a TextBox foram criadas para mostrar texto, portanto elas interpretarão os caracteres como sendo texto, daí a não-exibição correta dos bytes. O exemplo abaixo lê os bytes, transforma em um vetor de chars e converter para String:

        Dim abrir As New OpenFileDialog

        Dim resultado As DialogResult = abrir.ShowDialog()
        Dim nomearq As String = abrir.FileName
        If resultado = DialogResult.Cancel Then
            Exit Sub
        End If
        arquivoentrada = New FileStream(nomearq, FileMode.Open, FileAccess.Read)

        binarioentrada = New BinaryReader(arquivoentrada)
        Dim bytes() As Byte = binarioentrada.ReadBytes(arquivoentrada.Length)
        Dim chars(bytes.Length - 1) As Char

        Dim d As System.Text.Decoder = System.Text.Encoding.Default.GetDecoder()
        d.GetChars(bytes, 0, bytes.Length, chars, 0)
        Dim s As String = New String(chars)
        RichTextBox1.Text = s
        binarioentrada.Close()
        arquivoentrada.Close()

Desse jeito você vai mostrar os bytes na RichTextBox, mas como eu disse, a exibição não vai ser correta (o primeiro byte com valor 0 que ele encontrar vai ser considerado o final do texto, por exemplo).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, e qual objeto eu uso para exibir corretamente os dados???

Certos caracteres (bytes) não têm representação gráfica (como o chr(0), por exemplo). Ou seja, você não vai ter como mostrar "algo" na forma de caracter, se o mesmo não tem uma representação gráfica. A visualização mais usual que vejo para mostrar arquivos binários é mostrar os valores hexadecimais de cada um dos bytes. O exemplo a seguir faz isso:

        Dim abrir As New OpenFileDialog

        Dim resultado As DialogResult = abrir.ShowDialog()
        Dim nomearq As String = abrir.FileName
        If resultado = DialogResult.Cancel Then
            Exit Sub
        End If
        arquivoentrada = New FileStream(nomearq, FileMode.Open, FileAccess.Read)

        binarioentrada = New BinaryReader(arquivoentrada)
        Dim bytes() As Byte = binarioentrada.ReadBytes(arquivoentrada.Length)
        Dim b As Byte
        Dim qt As Integer = 1

        Dim s As New System.Text.StringBuilder
        For Each b In bytes
            s.Append(Hex(b).PadLeft(2, "0"))
            If qt = 10 Then
                s.Append(vbCrLf)
                qt = 0
            Else
                s.Append(" ")
            End If
            qt += 1
        Next
        RichTextBox1.Font = New Font("Courier New", 11, FontStyle.Regular, GraphicsUnit.Pixel)
        RichTextBox1.Text = s.ToString()
        binarioentrada.Close()
        arquivoentrada.Close()

Mudei a fonte para Courier New para que a exibição fique uniforme.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ei gray, tem como você me explicar esse codigo?? O que faz o metodo lenght??? O que e aquele each no for?? e o append, pra que que serve tb??? E o vbCrLf, o que e tb??? Desculpa ai pelas perguntas, mas e que fiquei mo curioso!! E valeu pelas respostas, falows!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Ei gray, tem como você me explicar esse codigo??

Claro. biggrin.gif

O que faz o metodo lenght???

Length (do Inglês, "comprimento") não é um método e sim uma propriedade e o retorno dela é a quantidade de bytes existentes no FileStream. Ela também aparece representando a quantidade de elementos em um vetor e a quantidade de caracteres existentes em uma string.

O que e aquele each no for??

Dê uma olhada neste tópico para uma explicação sobre o For Each: http://scriptbrasil.com.br/forum/index.php?showtopic=50443

e o append, pra que que serve tb???

O método Append de um objeto StringBuilder serve para montarmos uma string de tamanho variável em memória. Ela permite ir adicionando as partes da string desejada.

E o vbCrLf, o que e tb???

É uma constante que representa o ENTER (Cr = Carriage Return, Retorno de Carro; e Lf = Line Feed, Avanço de Linha).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Poxa, Gray, valeu mesmo, se manja muito! Aonde se aprendeu tanto assim? ohmy.gif E aproveitando o embalo, nesse codigo ai, as strings elas estao sendo mostradas em hexa, certo? mas e seu quisesse mostrar os valores decimais ( ou ascii ) delas, qual função eu utilizo???

Link para o comentário
Compartilhar em outros sites

  • 0

Poxa, Gray, valeu mesmo, se manja muito! Aonde se aprendeu tanto assim?  ohmy.gif

Obrigado. biggrin.gif Mas, eu bem que queria "manjar" mais... smile.gif

E aproveitando o embalo, nesse codigo ai, as strings elas estao sendo mostradas em hexa, certo? mas e seu quisesse mostrar os valores decimais ( ou ascii ) delas, qual função eu utilizo???

Os bytes já são os valores decimais. Basta não convertê-los para hexa.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

então no caso, se eu quiser exibir os dados em decimal, isso aqui fica dessa maneira:

 For Each b In bytes
           s.Append(b.PadLeft(2, "0"))
           If qt = 10 Then
               s.Append(vbCrLf)
               qt = 0
           Else
               s.Append(" ")
           End If
           qt += 1

E deixa eu perguntar: você e formado em que, gray?

Link para o comentário
Compartilhar em outros sites

  • 0

então no caso, se eu quiser exibir os dados em decimal, isso aqui fica dessa maneira:

 For Each b In bytes
           s.Append(b.PadLeft(2, "0"))
           If qt = 10 Then
               s.Append(vbCrLf)
               qt = 0
           Else
               s.Append(" ")
           End If
           qt += 1

Exato. Só que o ideal seria fazer s.Append(b.PadLeft(3, "0")), já que os valores vão de 0 até 255 (três algarismos).

E deixa eu perguntar: você e formado em que, gray?

Estou terminando a faculdade de Tecnólogo e fiz o Ensino Médio técnico em informática.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ei gray, mais uma duvidazinha: eu pensei que transformando pra decimal iam aparecer as letras dos valores correspondentes em Hexa tongue.gif , então qual e a função para transformar os valores em codigo ASCII para aparecerem as letras???

Link para o comentário
Compartilhar em outros sites

  • 0
então, há alguma forma de eu contornar isso? E aproveitando o embalo, e pra mim salvar as modificações no arquivo, como eu faço???

Sim, você poderia criar exceções para determinados bytes (como o 0, por exemplo) e inventar alguma coisa que pudesse descrevê-los. No exemplo abaixo, os bytes com valores de 0 até 31 serão representados na forma "#n" onde n é o valor (para encurtar, peguei só o loop):

        For Each b In bytes
            caracter = Chr(b)
            If b >= 0 And b <= 31 Then
                caracter = "#" & Asc(caracter)
            End If

            s.Append(caracter.PadLeft(3, " "))
            If qt = 10 Then
                s.Append(vbCrLf)
                qt = 0
            Else
                s.Append(" ")
            End If
            qt += 1
        Next

O processo é basicamente o contrário do anterior, ou seja, pegar todos os caracteres (bytes), juntá-los e gravá-los em um arquivo (pode ser sobrescrevendo o anterior, é claro). Porém, pegar e juntar os caracteres vai depender de como você vai exibir o arquivo e de como você vai permitir editá-lo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Mas porque do 0 ate o 31? Esses numeros não tem representação grafica?

Exatamente. Experimente aí e você verá que 0 não aparece e os demais podem aparecer como quadradinhos (todos iguais). É claro que isso também pode variar de acordo com a fonte utilizada.

Bem, e essa funcao Asc(), ela não converte para codigo ascii tb?

Não é "também"; é isso que ela faz. E sim, é claro que ali poderia ser:

caracter = "#" & b

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Gray, socorro!! rsrs. Bem, eu estava aqui tentando salvar os arquivos modificados, so que não consegui, e mole?? Bem, o meu código e esse:

        Dim salvar As New SaveFileDialog
        Dim resultado As DialogResult = salvar.ShowDialog
        If resultado = DialogResult.Cancel Then
            Return
        End If
        nomearq = salvar.FileName
        arquivosaida = New FileStream(nomearq, FileMode.Append, FileAccess.Write)
        binariosaida = New BinaryWriter(arquivoentrada)
        ...
        arquivosaida.Close()
        binariosaida.Close()

Bem, aonde estao os tres pontinhos e o problema. O que ue devo fazer? Devo usar o for each para colocar no arquivo byte por byte ou devo criar uma instancia do RichTextBox e mandar gravar no arquivo??

Link para o comentário
Compartilhar em outros sites

  • 0
Gray, socorro!! rsrs. Bem, eu estava aqui tentando salvar os arquivos modificados, so que não consegui, e mole?? Bem, o meu código e esse:

        Dim salvar As New SaveFileDialog
        Dim resultado As DialogResult = salvar.ShowDialog
        If resultado = DialogResult.Cancel Then
            Return
        End If
        nomearq = salvar.FileName
        arquivosaida = New FileStream(nomearq, FileMode.Append, FileAccess.Write)
        binariosaida = New BinaryWriter(arquivoentrada)
        ...
        arquivosaida.Close()
        binariosaida.Close()

Bem, aonde estao os tres pontinhos e o problema. O que ue devo fazer? Devo usar o for each para colocar no arquivo byte por byte ou devo criar uma instancia do RichTextBox e mandar gravar no arquivo??

Como o arquivo está sendo mostrado na RichTextBox? Você tem que pegar todos os bytes e gravá-los, só que o "pegar" vai depender de como você está exibindo-os.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, eu estou mostrando desta maneira:

RichTextBox1.Font = New Font("Courier New", 11, FontStyle.Regular, GraphicsUnit.Pixel)
RichTextBox1.Text = s.ToString()

No caso, se eu mandasse gravar a instancia s, serviria??

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, eu estou mostrando desta maneira:

RichTextBox1.Font = New Font("Courier New", 11, FontStyle.Regular, GraphicsUnit.Pixel)
RichTextBox1.Text = s.ToString()

No caso, se eu mandasse gravar a instancia s, serviria??

Mas, o que existe nesse "s"? Quando você lê o arquivo, você possui uma longa fila de bytes (caracteres), certo? Então, você tem que formar essa fila de novo ao gravar.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

No Caso, ficaria assim então:

 Dim salvar As New SaveFileDialog
       Dim resultado As DialogResult = salvar.ShowDialog
       If resultado = DialogResult.Cancel Then
           Return
       End If
       nomearq = salvar.FileName
       arquivosaida = New FileStream(nomearq, FileMode.Append, FileAccess.Write)
       binariosaida = New BinaryWriter(arquivoentrada)

 Dim s As New System.Text.StringBuilder
       For Each b In bytes
           s.Append(Hex(b).PadLeft(2, "0"))
           If qt = 10 Then
               s.Append(vbCrLf)
               qt = 0
           Else
               s.Append(" ")
           End If
           qt += 1
       Next

Ai no caso, eu usaria o for para reagrupar os bytes no arquivo, certo? MAs como faria para escrever no arquivo, e assim, esse for ta certo??? porque o append senao me engano ele "posta" os arequivos, certo??

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...