Estoy usando este código

        string location1 = textBox2.Text;
        byte[] bytes = File.ReadAllBytes(location1);
        string text = (Convert.ToBase64String(bytes));
        richTextBox1.Text = text;

Pero cuando uso un archivo que es demasiado grande, me salgo de la excepción de memoria.

Quiero usar File.ReadAllBytes en trozos. He visto un código como este por debajo de

System.IO.FileStream fs = new System.IO.FileStream(textBox2.Text, System.IO.FileMode.Open);
byte[] buf = new byte[BUF_SIZE];
int bytesRead;

//Read the file one kilobyte at a time.
do
{
    bytesRead = fs.Read(buf, 0, BUF_SIZE);               
    //'buf' contains the last 1024 bytes read of the file.

} while (bytesRead == BUF_SIZE);

fs.Close();

}

Pero no sé cómo convertir el bytesRead en una matriz de bytes que voy a convertir a texto.

EDICIÓN: Respuesta encontrada. Aquí está el código!

 private void button1_Click(object sender, EventArgs e)
    {
        const int MAX_BUFFER = 2048;
        byte[] Buffer = new byte[MAX_BUFFER];
        int BytesRead;
        using (System.IO.FileStream fileStream = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read))
            while ((BytesRead = fileStream.Read(Buffer, 0, MAX_BUFFER)) != 0)
            {
                string text = (Convert.ToBase64String(Buffer));
                textBox1.Text = text;

            }

}

Para cambiar el legibles bytes que están en formato de texto, cree un nuevo byte y hacerlo igual
(Convertir.FromBase64String(Texto)). Gracias a todos!

InformationsquelleAutor Layne3 | 2012-07-22

5 Comentarios

  1. 1

    La bytesRead es sólo el número de bytes a leer.

    Aquí es que algunos bloques de lectura

            var path = @"C:\Temp\file.blob";
    
            using (Stream f = new FileStream(path, FileMode.Open))
            {
                int offset = 0;
                long len = f.Length;
                byte[] buffer = new byte[len];
    
                int readLen = 100; //using chunks of 100 for default
    
                while (offset != len)
                {
                    if (offset + readLen > len)
                    {
                        readLen = (int) len - offset;
                    }
                    offset += f.Read(buffer, offset, readLen);
                }
            }

    Ahora usted tiene los bytes en el buffer y los puede convertir como te gusta.

    por ejemplo, en el «uso corriente»:

                string result = string.Empty;
    
                foreach (byte b in buffer)
                {
                    result += Convert.ToChar(b);
                }
  2. 1
    private void button1_Click(object sender, EventArgs e)
    {
        const int MAX_BUFFER = 2048;
        byte[] Buffer = new byte[MAX_BUFFER];
        int BytesRead;
        using (System.IO.FileStream fileStream = new FileStream(textBox2.Text, FileMode.Open, FileAccess.Read))
            while ((BytesRead = fileStream.Read(Buffer, 0, MAX_BUFFER)) != 0)
            {
                string text = (Convert.ToBase64String(Buffer));
                textBox1.Text = text;
    
            }
    }
  3. 0

    No, el valor de retorno de Read() es el número de bytes a leer. Los datos se encuentran en la matriz de bytes buf que se pasa a Read(). Usted debe tratar y entender el código en lugar de simplemente copiar & pegar, luego de preguntar por qué no funciona. Incluso si lo hace, el comentario dice ahí!

    • He intentado. Me pueden Ayudar por Favor? ¿Cómo puedo convertir todos los bufs a uno de los grandes de la matriz?
    • ¿Por qué hacer eso? Que derrota el propósito entero de la lectura en trozos! Y eso es exactamente lo que ReadAllBytes ¿
    • OK lo entiendo, así que cada vez que se lee en un fragmento, donde Hago para convertir una cadena y agregue un cuadro de texto. Como la parte de código
    • Y leer todos los bytes se presenta la memoria de excepción.
    • No sé exactamente qué es lo que estamos tratando de lograr! Si el archivo es mayor que la cantidad de memoria que tienes, vas a correr fuera de la memoria. Período. Usted debe explicar exactamente qué es lo que estamos tratando de hacer con este programa, entonces tal vez podemos darle el consejo de que tiene sentido.
    • Ok, quiero cargar archivos y llegar bytes, convertirlos al hacer la conversión.ToBase64String, a continuación, hacer un cuadro de texto el texto de los convertidos de bytes. Pero cuando hago esto y el archivo es demasiado grande (alrededor de 100 megas) puedo obtener una excepción de memoria insuficiente. Así que en Lugar quiero cargar la matriz en trozos, convertir cada fragmento a base 64 de la cadena y agregar a los cuadros de texto de texto. @Jonathan Reinhart
    • Y de donde crees que el texto en el cuadro de texto va? En memoria. No creo que realmente quieren mostrar un 100 MB archivo de texto en un cuadro de texto.

  4. 0

    Dependiendo de la estructura de archivos, podría ser más fácil para que usted utilice un StreamReader que expone un ReadLine método.

    using(var sr = new StreamReader(File.Open(textBox2.Text, FileMode.Open))
    {
        while (sr.Peek() >= 0) 
        {
            Console.WriteLine(sr.ReadLine());
         }
    }
    • Ok, en Lugar de escribir la línea, ¿cómo puedo añadir de cada fragmento a una matriz que voy a convertir en una cadena. O convertir cada byte en una cadena y agregar a otra cadena?
    • Sólo tiene que añadir a una cadena…… (usando el operador ‘+’)
  5. 0

    Si el archivo es un archivo de texto se puede utilizar un TextReader:

       string location1 = textBox2.Text;
        string text  = String.Empty;
        using (TextReader reader = File.OpenText(location1 ))
        {
               do
               {
               string line = reader.ReadLine();
                   text+=line;
                }
                while(line!=null)
    
        }

Dejar respuesta

Please enter your comment!
Please enter your name here