问题
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