none
Copiar bytes a otro archivo RRS feed

  • Pregunta

  • Hola de nuevo. Mi pregunta es si como puedo hacer para copiar bytes de un archivo hexadecimal a otro, osea un nuevo archivo. 

    Como en la imagen tengo un archivo grande y lo que quiero es copiar esos bytes a otro archivo nuevo. Lo que necesito copiar tiene una longitud de 1814386 bytes de longitud

    El archivo es grande y los bytes a copiar es apartir del 2048 a 1816434

    viernes, 4 de octubre de 2019 17:28

Respuestas

  • Para copiar grandes cantidades de bytes de un archivo a otro, abre un FileStream contra cada archivo (uno en lectura y otro en escritura). Por lo que veo en tu codigo, ya sabes como se abre un FileStream.

    A continuacion, el truco es que no usas un BinaryWriter, sino que directamente usas el metodo Read contra el FileStream de origen, y Write contra el FileStream de destino.

    Estos dos metodos usan un buffer que es un array de bytes, y la longitud la pasas dentro de la llamada a Read o Write. Por ejemplo, para leer diez mil bytes:

    FileStream fsLectura = ...;
    fslectura.Seek(...); // Posicionarse en el sitio donde comienza la lectura; si no usas Seek, or defecto empieza en cero.
    
    int bytesALeer = 10000; // Por ejemplo.
    byte[] buffer = new byte[bytesALeer];
    fsLectura.Read(buffer, 0, bytesALeer);
    
    // Ahora tienes los bytes en el buffer.
    // De manera muy similar los puedes escribir en el destino

    Desde luego, puedes usar un numero mayor que 10000. Si el numero es demasiado grande como para reservar en memoria un buffer de esa longitud, entonces lo que se hace es poner el Read y el Write dentro de un bucle que vaya leyendo y copiando un bloque moderado de bytes a cada "vuelta" del bucle.


    martes, 8 de octubre de 2019 15:16

Todas las respuestas

  • Hola de nuevo. No he conseguido hacer lo que buscaba. 

    Antes usaba este código para pasar 8 bytes de un archivo a otro: pero ahora busco una forma de hacer algo similar pero con una longitud de bytes más grandes.

    Dim datos As String

            Dim fs As New FileStream("C:\Users\Lucas\Desktop\File.bin", FileMode.Open)

            Dim br As New BinaryReader(fs)

            fs.Position = 2048

            datos = br.ReadInt64()

            fs.Close()

            br.Close()

            Dim fs2 As New FileStream("C:\Users\Lucas\Desktop\File2.bin", FileMode.OpenOrCreate)

            Dim bw As New BinaryWriter(fs2)

            fs2.Position = 0

            bw.Write(Int64.Parse(datos))

            fs2.Close()

            bw.Close()

    Lo que  buscaba preguntando es cómo hacer lo mismo pero con una longitud más grande. Por ejemplo 1,72 Mb por ejemplo

    Osea. Extraer de un archivo esa cantidad y crear un nuevo archivo apartir de lo que se extrajo.

    martes, 8 de octubre de 2019 15:07
  • Para copiar grandes cantidades de bytes de un archivo a otro, abre un FileStream contra cada archivo (uno en lectura y otro en escritura). Por lo que veo en tu codigo, ya sabes como se abre un FileStream.

    A continuacion, el truco es que no usas un BinaryWriter, sino que directamente usas el metodo Read contra el FileStream de origen, y Write contra el FileStream de destino.

    Estos dos metodos usan un buffer que es un array de bytes, y la longitud la pasas dentro de la llamada a Read o Write. Por ejemplo, para leer diez mil bytes:

    FileStream fsLectura = ...;
    fslectura.Seek(...); // Posicionarse en el sitio donde comienza la lectura; si no usas Seek, or defecto empieza en cero.
    
    int bytesALeer = 10000; // Por ejemplo.
    byte[] buffer = new byte[bytesALeer];
    fsLectura.Read(buffer, 0, bytesALeer);
    
    // Ahora tienes los bytes en el buffer.
    // De manera muy similar los puedes escribir en el destino

    Desde luego, puedes usar un numero mayor que 10000. Si el numero es demasiado grande como para reservar en memoria un buffer de esa longitud, entonces lo que se hace es poner el Read y el Write dentro de un bucle que vaya leyendo y copiando un bloque moderado de bytes a cada "vuelta" del bucle.


    martes, 8 de octubre de 2019 15:16
  • Muchas Gracias por la respuesta. Se me está complicando aplicar el código que me dejaste.

    Aún no termino de entenderlo bien 😅

    martes, 8 de octubre de 2019 16:05
  • A ver, te lo pongo entero. Dado que solo quieres copiar 1814386 bytes te cabe completo en memoria en un único buffer, así que no se necesita bucle ni nada. Simplemente abrimos los dos ficheros, y hacemos un Read y un Write:

    int bytesACopiar = 1814386; 
    byte[] buffer = new byte[bytesALeer];
    
    using (FileStream fsLectura = new FileStream(...))
    {
        fsLectura.Read(buffer, 0, bytesACopiar);
    }
    
    using (FileStream fsEscritura = new FileStream(...))
    {
        fsEscritura.Write(buffer, 0, bytesACopiar);
    }


    martes, 8 de octubre de 2019 17:58
  • Logré entender el ejemplo que me diste primero y ya pude dar con el código. Me funciona perfectamente. 

    Lo hice así:

            Dim bytesRead As Integer
            Dim Inicio As Integer
            Inicio = 2048
            Dim Longitud As Integer
            Longitud = 1814386
            Dim buffer(Longitud) As Byte
            Dim bytesALeer As Integer = buffer.Length
            Using inFile As New System.IO.FileStream("C:\Users\Lucas\Desktop\File.bin", IO.FileMode.Open, IO.FileAccess.Read)
                Using outFile As New System.IO.FileStream("C:\Users\Lucas\Desktop\File2.bin", IO.FileMode.Create, IO.FileAccess.Write)
                    bytesRead = inFile.Seek(Inicio, SeekOrigin.Begin)
                    bytesRead = inFile.Read(buffer, 0, bytesALeer)
                    If bytesRead > 0 Then
                        outFile.Write(buffer, 0, bytesRead)
                    End If
                End Using
            End Using
    Muchas Gracias por responder. ♥️♥️♥️
    martes, 8 de octubre de 2019 18:18