How do I use File.ReadAllBytes In chunks

爷,独闯天下 提交于 2019-12-18 09:56:53

问题


I am using this code

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

But when I use a file that is too big I get out of memory exception.

I want to use File.ReadAllBytes in chunks. I have seen code like this below

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();

}

But I don't know how to actually convert the bytesRead into a byte array which I will convert to text.

EDIT: Answer found. Here is the code!

 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;

            }

}

To change the readable bytes which are in text format, create a new byte and make it equal (Convert.FromBase64String(Text)). Thanks everyone!


回答1:


The bytesRead is just the count of bytes read.

Here is some block reading

        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);
            }
        }

Now you have the bytes in the buffer and can convert them as you like.

for example inside the "using stream":

            string result = string.Empty;

            foreach (byte b in buffer)
            {
                result += Convert.ToChar(b);
            }



回答2:


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:


No, the return value from Read() is how many bytes were read. The data is in the byte array buf that you are passing to Read(). You should try and understand code instead of just copy & pasting, then asking why it doesn't work. Even if you do, the comment says it right there!




回答4:


Depending on the file structure, it might be easier for you to use a StreamReader which exposes a ReadLine method.

using(var sr = new StreamReader(File.Open(textBox2.Text, FileMode.Open))
{
    while (sr.Peek() >= 0) 
    {
        Console.WriteLine(sr.ReadLine());
     }
}



回答5:


If the file is a text file you can use a 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)

    }


来源:https://stackoverflow.com/questions/11597295/how-do-i-use-file-readallbytes-in-chunks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!