Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Mr. God en 3 Abril 2010, 14:54 pm



Título: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 3 Abril 2010, 14:54 pm
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!!!


Título: Re: Borrar bytes de archivo y guardar
Publicado por: raul338 en 3 Abril 2010, 15:14 pm
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
  1. StreamReader archivoOriginal = File.Open("archivo", FileMode.Open);
  2.  
  3. // Para escribir el mismo archivo sin las primeras 14 lineas
  4. archivoOriginal.Seek(14, SeekOrigin.Begin); // Mueve al byte 14
  5.  
  6. StreamWriter archivoDestino = File.Open("archivoNuevo", FileMode.CreateNew);
  7.  
  8. // --- Para escribir 14 bytes vacios al principio agrega esto -------
  9. int bytes[] = new int[14];
  10. for (int i = 0; i < bytes.Length; i++)
  11.    bytes[i] = 0;
  12.  
  13. archivoDestino.Write(bytes);
  14. archivoDestino.Flush();
  15. // -----------------------------------------------------------------------
  16.  
  17. archivoDestino.Write(archivoOriginal.ReadToEnd());
  18. archivoDestino.Flush();
  19. archivoDestino.Close();
  20. archivoOriginal.Close();
  21.  

Espero que te sirva!!!


Título: Re: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 3 Abril 2010, 15:51 pm
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í:

Código:
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!!


Título: Re: Borrar bytes de archivo y guardar
Publicado por: 43H4FH44H45H4CH49H56H45H en 3 Abril 2010, 20:12 pm
A la rapida puede ser asi:

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

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


Título: Re: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 3 Abril 2010, 20:45 pm
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.  :)


Título: Re: Borrar bytes de archivo y guardar
Publicado por: raul338 en 3 Abril 2010, 21:01 pm
Código
  1. // Crea un archivo
  2. private void button1_Click(object sender, EventArgs e)
  3. {
  4.    StreamWriter sw = new StreamWriter(Application.StartupPath + Path.DirectorySeparatorChar + "archivo.txt", false);
  5.    sw.Write("".PadLeft(50, '5'));
  6.    sw.Flush();
  7.    sw.Close();
  8. }
  9.  
  10. // Le saca los primeros 14 bytes y los pone en otro archivo
  11. private void button2_Click(object sender, EventArgs e)
  12. {
  13.    FileStream sr = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo.txt", FileMode.Open);
  14.    sr.Seek(14, SeekOrigin.Begin);
  15.    FileStream sw = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo2.txt", FileMode.Create);
  16.    while (sr.Position != sr.Length)
  17.        sw.WriteByte(Convert.ToByte(sr.ReadByte()));
  18.    sr.Close();
  19.    sw.Close();
  20. }
  21.  

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 :)


Título: Re: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 4 Abril 2010, 16:06 pm
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!!


Título: Re: Borrar bytes de archivo y guardar
Publicado por: raul338 en 4 Abril 2010, 18:24 pm
:| 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)



Título: Re: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 4 Abril 2010, 19:36 pm
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:

Código:
"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í:

Código:
"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!!



Título: Re: Borrar bytes de archivo y guardar
Publicado por: 43H4FH44H45H4CH49H56H45H en 5 Abril 2010, 03:03 am
Solo es modificar un poco el code:

Código
  1. byte[] leer = File.ReadAllBytes("C:\\1.txt");
  2. FileStream fstream = new FileStream("C:\\2.txt", FileMode.Create, FileAccess.Write);
  3. BinaryWriter escribir = new BinaryWriter(fstream);
  4. int control = 0;
  5. for (int i = 0; control < 4; i++)
  6. {
  7.   if (i == 17)
  8.      {
  9.         control++;
  10.          i = 0;
  11.       }
  12.    escribir.Write(leer[i]);
  13. }
  14. for (int i1 = 1; i1 < leer.Length; i1++)
  15. {
  16.    escribir.Write(leer[i1]);
  17. }
  18. escribir.Close();
  19. fstream.Close();

Falta mejorar pero sirve de ejemplo  :silbar:

Archivo Original
Código:
Hola, como andan? Yo bien, ¿y tú?
Archivo Nuevo
Código:
Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan?Hola, como andan? Yo bien, ¿y tú?


Título: Re: Borrar bytes de archivo y guardar
Publicado por: Mr. God en 5 Abril 2010, 11:13 am
Jeje, ahora ya casi perfecto, en un principio la cosa era que copiase los 17 bytes que están en una  posición en concreto, es decir, desde el byte 93 (Offset 0000004D) del archivo hasta el byte 110 (Offset 0000005C) y los copiase debajo del 110, si ya por ultimo me pueden ayudar con eso seria genial :D

p.d. he probado desplazándome con Seek, pero me da fallo... en C# soi bastante novatillo jeje  :-X :-X


Título: Re: Borrar bytes de archivo y guardar
Publicado por: raul338 en 5 Abril 2010, 15:08 pm
Código
  1. // Generamos el archivo
  2. StreamWriter sw = new StreamWriter(Application.StartupPath + Path.DirectorySeparatorChar + "archivo3.txt", false);
  3. sw.Write("".PadLeft(93) + "Hola, esto es un ejemplo" + "".PadLeft(100, '0'));
  4. sw.Flush();
  5. sw.Close();
  6.  
  7. // .................................................
  8. // En otro codigo (otro boton, etc, sino genera error con el "sw" anterior
  9. // .................................................
  10.  
  11. // Parametros
  12. int offsetInicio = 93;
  13. int offsetFinal = 110;
  14. int repeticiones = 4;
  15. // esta demas, pero es que en .net piden la longitud, no la ubicacion final :P
  16. int lenOffset = offsetFinal - offsetInicio;
  17.  
  18. FileStream sr = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo3.txt", FileMode.Open);
  19. // Va hacia el inicio del offset
  20. sr.Seek(offsetInicio, SeekOrigin.Begin);
  21. byte[] frase = new byte[lenOffset];
  22. // Copiamos los 17 caracteres
  23. sr.Read(frase, 0, lenOffset);
  24. sr.Seek(0, SeekOrigin.Begin);
  25.  
  26. FileStream sw = File.Open(Application.StartupPath + Path.DirectorySeparatorChar + "archivo4.txt", FileMode.Create);
  27. // Copiamos lo que estaba antes del offset
  28. while (sr.Position < offsetFinal)
  29. {
  30.    sw.WriteByte(Convert.ToByte(sr.ReadByte())); sw.Flush();
  31. }
  32.  
  33. // repetimos el offset
  34. for (int i = 0; i <= repeticiones; i++)
  35. {
  36.    sw.Write(frase, 0, frase.Length); sw.Flush();
  37. }
  38.  
  39. // copiamos el resto del archivo
  40. while (sr.Position < sr.Length)
  41. {
  42.    sw.WriteByte(Convert.ToByte(sr.ReadByte()));sw.Flush();
  43. }
  44.  
  45. sw.Close();
  46. sr.Close();
  47.  

Espero que te sirva :)


Título: Re: Borrar bytes de archivo y guardar
Publicado por: 43H4FH44H45H4CH49H56H45H en 6 Abril 2010, 05:50 am
Puede ser asi tb:

Código
  1. byte[] leer = File.ReadAllBytes("C:\\1.txt");
  2. FileStream fstream = new FileStream("C:\\2.txt", FileMode.Create, FileAccess.Write);
  3. BinaryWriter escribir = new BinaryWriter(fstream);
  4. for (int i1 = 1; i1 < leer.Length; i1++)
  5. {
  6.   escribir.Write(leer[i1]);
  7.      if (i1 == 109)
  8.       {
  9.          for (int i = 93; i<111; i++)
  10.             {
  11.                escribir.Write(leer[i]);
  12.              }
  13.         }
  14. }
  15. escribir.Close();
  16. fstream.Close();