Borrar bytes de archivo y guardar

Iniciado por Mr. God, 3 Abril 2010, 14:54 PM

0 Miembros y 1 Visitante están viendo este tema.

Mr. God

Hola, que tal?? Quería comentarles mi duda, a ver si saben ayudarme  :xD

A ver, quiero que al pulsar un botón se abra un archivo (que sé hacerlo, con un OpenFileDialog) y que se borre automaticamente un numero de bytes del principio del archivo (en concreto 14 bytes), y que una vez hecho, se guarde el archivo con los bytes eliminados.

cualquier ayuda o pista me viene genial :):):):)

P.D. El lenguaje es vb.net ^^

Salu2!!!

raul338

Usa el namespace System.IO y la clase streamReader y streamWriter
ahora, una pregunta, quieres que sea del mismo tamaño (14 bytes vacios al principio) o sin los 14 bytes del principio? es medio existencial mi duda jeje

igual, de todas formas seria algo asi (es codigo hecho al vuelo, puede que haya mas de un error :xD)

Código (csharp) [Seleccionar]

StreamReader archivoOriginal = File.Open("archivo", FileMode.Open);

// Para escribir el mismo archivo sin las primeras 14 lineas
archivoOriginal.Seek(14, SeekOrigin.Begin); // Mueve al byte 14

StreamWriter archivoDestino = File.Open("archivoNuevo", FileMode.CreateNew);

// --- Para escribir 14 bytes vacios al principio agrega esto -------
int bytes[] = new int[14];
for (int i = 0; i < bytes.Length; i++)
    bytes[i] = 0;

archivoDestino.Write(bytes);
archivoDestino.Flush();
// -----------------------------------------------------------------------

archivoDestino.Write(archivoOriginal.ReadToEnd());
archivoDestino.Flush();
archivoDestino.Close();
archivoOriginal.Close();


Espero que te sirva!!!

Mr. God

#2
Gracias por la respuesta jeje  ;D ;D

La cosa es sin los 14 bytes del principio :) En un principio lo iba a hacer en vb.net, aunque también se algo de C# (Pero bastante poco, al contrario que de vb.net), y me tira 2 errores, que no se puede convertir System.IO.FileStream en System.IO.StreamReader/StreamWriter, y que IO.StreamReader no contiene una definición de Seek.

Por supuesto, añadí "using System.IO;"

Dejé el code así:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Bytes
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            StreamReader archivoOriginal = File.Open("archivo", FileMode.Open);

            archivoOriginal.Seek(14, SeekOrigin.Begin);

StreamWriter archivoDestino = File.Open("archivoNuevo", FileMode.CreateNew);


archivoDestino.Write(archivoOriginal.ReadToEnd());
archivoDestino.Flush();
archivoDestino.Close();
archivoOriginal.Close();


        }
    }
}


El fallo da en los Seek y en los File.Open()


gracias de nuevo y saludos!!

43H4FH44H45H4CH49H56H45H

A la rapida puede ser asi:

Código (csharp) [Seleccionar]

byte[] leer = File.ReadAllBytes("C:\\1.txt");
FileStream fstream = new FileStream("C:\\2.txt", FileMode.Create, FileAccess.Write);
BinaryWriter escribir = new BinaryWriter(fstream);
for(int i=15;i<leer.Length;i++)
   {
       escribir.Write(leer[i]);
    }
escribir.Close();
fstream.Close();


Funcionaría con *.exe u otros que necesites.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W

Mr. God

Perfecto  ;D ;D muchas gracias, 43H4FH44H45H4CH49H56H45H, le hice unos arreglos para complementarlo con openFileDialog y saveFileDialog y perfecto

tambien dar las gracias a Raul por su anterior ayuda.  :)

raul338

#5
Código (csharp) [Seleccionar]

// Crea un archivo
private void button1_Click(object sender, EventArgs e)
{
   StreamWriter sw = new StreamWriter(Application.StartupPath + Path.DirectorySeparatorChar + "archivo.txt", false);
   sw.Write("".PadLeft(50, '5'));
   sw.Flush();
   sw.Close();
}

// Le saca los primeros 14 bytes y los pone en otro archivo
private void button2_Click(object sender, EventArgs e)
{
   FileStream sr = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo.txt", FileMode.Open);
   sr.Seek(14, SeekOrigin.Begin);
   FileStream sw = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo2.txt", FileMode.Create);
   while (sr.Position != sr.Length)
       sw.WriteByte(Convert.ToByte(sr.ReadByte()));
   sr.Close();
   sw.Close();
}


Funciona, y espero que te sirva :)

EDIT: no vi la anterior respuesta, esta desarrondo la mia jaja
Ese convert.ToByte esta porque extrañamente ReadByte devuelve un integer :¬¬

Espero que las 2 respuestas te sirvan :)

Mr. God

Gracias Raul por la nueva respuesta jeje  ;D

si no es mucha molestia, me gustaria preguntar como hacerle un pequeño añadido al programa. Es que se añada una frase que está en el offset 0000004D y que acaba en el offset 00000055 un numero X de veces (4 veces, por ejemplo), y esas frase deben empezar justamente debajo del offset 00000055, es decir, en el 00000056 y acabar donde acaben, y que después de esas frases se guarde el archivo con el mismo contenido que el original, menos los bytes quitados del principio del archivo (que ya está hecho jeje) y esas frases de más. Al final dará un archivo más grande que el original.

se que es lioso, pero seria genial que pudiesen ayudarme, si nopueden, lo entiendo jeje

salu2!!

raul338

:| no entendi, lo que quieres hacer es sobreescribir un archivo entre tal y tal bytes?.... seria lo mismo, usa seek(poscicionByteInicial, seekOrigin.Begin) y escribe tu frase (Usa System.Encoding.ASCII.GetBytes para obtener un array de bytes de la frase) y si la frase no llega a completar el bloque (supongamos, son 10 bytes reservados y tu solo llenas 4), escribe los bytes sobrantes con bytes nulos (0)


Mr. God

#8
Jeje, a ver, me refiero a esto: (a ver si ahora logras entendero :D :D)

1º Obtener una frase de un offset con inicio 0000004D y fin 00000055
2º Copiar esa misma frase 4 veces debajo del offset de finalización de la frase, es decir, a partir del 00000056, de modo que si el archivo original fuese:

"Hola, como andan? Yo bien, ¿y tú?"

donde la H de Hola corresponde al offset 0000004D y la ? fuese el 00000055 (es un ejemplo). Con lo que me gustaría hacer, deberia de quedar así:

"Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan?Yo bien, ¿y tú?"

por lo que el archivo se agrandaría, basicamente eso es lo que quiero jeje  ;D

salu2 y gracias!!


43H4FH44H45H4CH49H56H45H

Solo es modificar un poco el code:

Código (csharp) [Seleccionar]

byte[] leer = File.ReadAllBytes("C:\\1.txt");
FileStream fstream = new FileStream("C:\\2.txt", FileMode.Create, FileAccess.Write);
BinaryWriter escribir = new BinaryWriter(fstream);
int control = 0;
for (int i = 0; control < 4; i++)
{
   if (i == 17)
      {
         control++;
          i = 0;
       }
    escribir.Write(leer[i]);
}
for (int i1 = 1; i1 < leer.Length; i1++)
{
    escribir.Write(leer[i1]);
}
escribir.Close();
fstream.Close();


Falta mejorar pero sirve de ejemplo  :silbar:

Archivo Original
Hola, como andan? Yo bien, ¿y tú?
Archivo Nuevo
Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan? Yo bien, ¿y tú?

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W