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