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

E ai, Gray, mais problemas. Bem, fiz como você mandou, estou salvando byte por byte e convertendo caracter por caracter, mas mesmo assim não grava os arquivos, da uma olhada:

arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
            binariosaida = New BinaryWriter(arquivosaida)

            Dim dt As DataTable = dghexa.DataSource

            For Each linha As DataRow In dt.Rows
                For Each coluna As DataColumn In dt.Columns
                    Debug.WriteLine(linha(coluna))
                    Dim a As String
                    a = (linha(coluna))
                    binariosaida.Write(Asc(a))
                Next
            Next

O que tem de errado?

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui...

a = (linha(coluna))

... o que estará em "a"? Uma string com um valor hexadecimal (por exemplo, "A3"). Você precisa converter esse "A3" para o decimal 163 e daí gravar com o método write do BinaryWriter. Acho que a função System.Uri.HexUnescape() pode lher ser útil nesse caso.

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
           binariosaida = New BinaryWriter(arquivosaida)

           Dim dt As DataTable = dghexa.DataSource

           For Each linha As DataRow In dt.Rows
               For Each coluna As DataColumn In dt.Columns
                   Dim a As String
                   a = System.Uri.HexUnescape((linha(coluna)))
                   binariosaida.Write(Asc(a))
               Next
           Next

então com esse codigo o texto salvaria corretamente?

Link para o comentário
Compartilhar em outros sites

  • 0
arquivosaida = New FileStream(nomearq, FileMode.Open, FileAccess.Write)
           binariosaida = New BinaryWriter(arquivosaida)

           Dim dt As DataTable = dghexa.DataSource

           For Each linha As DataRow In dt.Rows
               For Each coluna As DataColumn In dt.Columns
                   Dim a As String
                   a = System.Uri.HexUnescape((linha(coluna)))
                   binariosaida.Write(Asc(a))
               Next
           Next
então com esse codigo o texto salvaria corretamente?
Não... você viu o que é o retorno de...
a = System.Uri.HexUnescape((linha(coluna)))

...? Verifique o que essa função está retornando (se é que está retornando algo).

Abraços,

Grymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Bem, ela não retorna nada, ela nem da certo aqui, da erro na linha de comando. O que ela deveria fazer?

Exatamente. Essa função foi criada para converter valores hexadecimais de uma URL, que ficam com um "%" na frente. Por isso, você tem que utilizá-la assim:

        Dim h As String = "A3"
        MessageBox.Show(System.Uri.HexUnescape("%" & h, 0))

E isso vai retornar o *caracter* correspondente, devendo você obter o valor ASCII do mesmo com a função Asc().

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ai Gray, bem, esse comando funcionou, eu escrevi dessa maneira:

    dtHexa = dghexa.DataSource

            Dim dt As DataTable = dghexa.DataSource
            For Each linha As DataRow In dt.Rows
                For Each coluna As DataColumn In dt.Columns
                    Dim h As String = linha(coluna)
                    Dim armazena As String
                    armazena = System.Uri.HexUnescape(h, 1)
                    binariosaida.Write(Asc(armazena))
                Next
            Next

ELe mostra o Ascii correspondente ao caracter, mas mesmo assim ele não salva corretamente, eu to fazendo , pra variar, alguma coisa errada de novo?

Link para o comentário
Compartilhar em outros sites

  • 0
E ai Gray, bem, esse comando funcionou, eu escrevi dessa maneira:

    dtHexa = dghexa.DataSource

            Dim dt As DataTable = dghexa.DataSource
            For Each linha As DataRow In dt.Rows
                For Each coluna As DataColumn In dt.Columns
                    Dim h As String = linha(coluna)
                    Dim armazena As String
                    armazena = System.Uri.HexUnescape(h, 1)
                    binariosaida.Write(Asc(armazena))
                Next
            Next
ELe mostra o Ascii correspondente ao caracter, mas mesmo assim ele não salva corretamente, eu to fazendo , pra variar, alguma coisa errada de novo?
Sim, você está utilizando HexUnescape() incorretamente. Dê uma lida novamente no meu post anterior. E faça um teste simples aí (comparando o meu jeito com o seu):
        Dim dado As String = "FF" 'Como sabemos FF é 255

        Dim c1 As Char
        c1 = System.Uri.HexUnescape("%" & dado, 0) 'Meu jeito
        MessageBox.Show(Asc(c1))

        Dim c2 As Char
        c2 = System.Uri.HexUnescape(dado, 1) 'Seu jeito
        MessageBox.Show(Asc(c2))

Certo? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, Gray, o codigo então ficou dessa maneira, correto?

         Dim dt As DataTable = dghexa.DataSource
            For Each linha As DataRow In dt.Rows
                For Each coluna As DataColumn In dt.Columns
                    Dim h As String = linha(coluna)
                    Dim armazena As String
                    armazena = System.Uri.HexUnescape("%" & h, 0)
                    binariosaida.Write(Asc(armazena))
                Next
            Next

Bem, agora a funnção esta sendo usada corretamente, como você falou! So que digamos que eu abra um arquivo com esse texto dentro:

haha

hehe

hihi

hoho

huhu

Bem, quando eu mando salvar, ele fica dessa maneira:

h  a  h  a 

 

  h  e  h  e 

 

  h  i  h  i 

 

  h  o 

Bem, os valores ascii estão sendo convertidos corretamete, não estão? Seria a maneira de gravar que está errada então?

Link para o comentário
Compartilhar em outros sites

  • 0

Hummm... agora pode ser uma questão de codificação do arquivo (encoding). Se não me engano, ao criar o BinaryWriter você tem a opção de escolher um encoding. Você pode ir experimentando eles para ver qual dá o resultado correto. Estou um pouco atarefado no momento, mas assim que surgir um tempinho eu vejo isso aqui pra você. Só me lembre, se não eu esqueço. smile.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, mas um arquivo do bloco de notas e codificado? Caramba, hein!

Sim, o mundo agora é Unicode! biggrin.gif

Consegui aqui assim:

        Dim nomearq As String = "c:\teste.exe"

        Dim dt As DataTable = dgHexa.DataSource
        Dim f As FileStream = New FileStream(nomearq, FileMode.Create, FileAccess.Write)
        Dim bw As BinaryWriter = New BinaryWriter(f, System.Text.Encoding.GetEncoding(28591))

        For Each linha As DataRow In dt.Rows
            For Each coluna As DataColumn In dt.Columns
                Dim b As Char = System.Uri.HexUnescape("%" & linha(coluna), 0)
                bw.Write(b)
            Next
        Next
        bw.Close()
        f.Close()
        MessageBox.Show("Ok!")
O macete está na linha...
Dim bw As BinaryWriter = New BinaryWriter(f, System.Text.Encoding.GetEncoding(28591))

... na qual o GetEncoding(28591) retorna a codificação ISO-8859-1 (também conhecida como Latin-1 e é a mais utilizada por nós) que possui a representação de caracteres no esquema de 8 bits (256 caracteres). Estranhamente este encoding não está presente na lista de codificações disponíveis diretamente (como ASCII, UTF8, Default, Unicode, etc. listados em System.Text.Encoding).

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, Gray, infelizmente aqui não funcionou... sad.gif Bem, eu notei umas coisas nesse codigo:

       Dim nomearq As String = "c:\teste.exe"
Arquivo executavel, porque isso?
               Dim b As Char = System.Uri.HexUnescape("%" & linha(coluna), 0)
               bw.Write(b)

Não deveria converter com a função Asc antes de salvar?

Bem, você tem alguma opnião porque aqui não deu certo?

valeu, Gray!

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, Gray, infelizmente aqui não funcionou... sad.gif  Bem, eu notei umas coisas nesse codigo:

       Dim nomearq As String = "c:\teste.exe"
Arquivo executavel, porque isso?
Porque era o arquivo de teste que eu estava utilizando aqui, já que arquivos executáveis são binários. Claro que pode ser qualquer outro.
               Dim b As Char = System.Uri.HexUnescape("%" & linha(coluna), 0)
               bw.Write(b)

Não deveria converter com a função Asc antes de salvar?

Não precisa, porque o método Write() é sobrecarregado para aceitar Char também (e mais cerca de 13 outros tipos).

Bem, você tem alguma opnião porque aqui não deu certo?

Você disse que "não deu certo"... mas não disse o que exatamente não deu certo. O arquivo não foi gravado corretamente? Deu algum erro?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Encontrei o problema. Neste For...

For i = 0 To (bytes.Length - 10) Step 10
... existe o problema de incrementar a variável iteradora de 10 em 10. Isso significa que se o tamanho do arquivo não for múltiplo de 10, faltarão os bytes finais. Para resolver isso, é só colocar o seguinte após o Next do For acima:
        Dim diferença As Integer = (bytes.Length - 1) - i
        If diferença > 0 Then
            Dim aE As New ArrayList
            For j As Integer = i To bytes.Length - 1
                aE.Add(bytes(j))
            Next

            Dim elementos() As Object = aE.ToArray(Type.GetType("System.Object"))
            Dim aH As New ArrayList
            Dim aC As New ArrayList
            Dim elemento As String

            For Each elemento In elementos
                aH.Add(Hex(elemento).PadLeft(2, "0"))
                aC.Add(Chr(elemento))
            Next

            dtHexa.Rows.Add(aH.ToArray(Type.GetType("System.Object")))
            dtChar.Rows.Add(aC.ToArray(Type.GetType("System.Object")))
        End If
Desta maneira, os bytes finais serão colocados nas grades também. Como podem ficar colunas nulas na grade, é necessário modificar a gravação do arquivo também (vou colocar aqui só loop da gravação):
        For Each linha As DataRow In dt.Rows
            For Each coluna As DataColumn In dt.Columns
                If Not TypeOf linha(coluna) Is System.DBNull Then
                    Dim b As Char = System.Uri.HexUnescape("%" & linha(coluna), 0)
                    bw.Write(b)
                End If
            Next
        Next

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ei Gray, valeu, hein! Obrigado por tudo, aqui funcionou corretamente! Deixa eu perguntar:

Encontrei o problema. Neste For...

CODE 

For i = 0 To (bytes.Length - 10) Step 10

... existe o problema de incrementar a variável iteradora de 10 em 10. Isso significa que se o tamanho do arquivo não for múltiplo de 10, faltarão os bytes finais.

Isso ocorre por os bytes serem multiplos de 8?

Desta maneira, os bytes finais serão colocados nas grades também.

Bem, eu não entendi, como assim os bytes finais serao colocados na grades?

Link para o comentário
Compartilhar em outros sites

  • 0

Suponha que o arquivo tem 206 bytes. Da maneira que eu tinha feito, pulando de 10 em 10, você teria vinte linhas de dez bytes cada (20*10=200), certo? E os outros 6 bytes? Eles não estavam sendo exibidos na grade, portanto também não estavam sendo gravados no novo arquivo. Entendeu? wink.gif

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, Gray, este processo da certo, so que ele e muito lento! Por Exemplo, ele demora 2 minutos para abrir um arquivo binario de 2 megas, e tem um outro programa aqui que peguei da Internet que faz isso quase que instantaneamente! Como que eu faço para melhorar o processo do meu programa? Vi em uma pagina uma vez que posso fazer isso com Threads, e possivel?

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, Gray, este processo da certo, so que ele e muito lento! Por Exemplo, ele demora 2 minutos para abrir um arquivo binario de 2 megas, e tem um outro programa aqui que peguei da Internet que faz isso quase que instantaneamente! Como que eu faço para melhorar o processo do meu programa? Vi em uma pagina uma vez que posso fazer isso com Threads, e possivel?

Bom, o problema não está no tempo para carregamento do arquivo, mas sim na sua apresentação na tela (na DataGrid, mas especificamente). Levou *2 segundos* para ler um arquivo de *49MB* aqui. Você pode verificar isso fazendo (no lugar onde está apenas a segunda linha abaixo):

        Dim início As DateTime = DateTime.Now
        bytes = br.ReadBytes(f.Length)
        Dim fim As DateTime = DateTime.Now
        Debug.WriteLine(fim.Subtract(início).ToString())

Creio que o mais demorado, no caso, seja o preenchimento da DataTable. Vou ver se uma lista (IList) seria mais viável e te retorno.

Abraços,

Graymalkin

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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...