我试图使用datagridview将二进制文件读入我自己的十六进制编辑器。
这是我的初步方法
FileStream RawD = new FileStream(ECUFileName, FileMode.Open, FileAccess.Read);
BinaryReader RawB = new BinaryReader(RawD);
然后我也尝试过二元阅读器......
现在我正在使用
MemoryMappedFile RawD = MemoryMappedFile.CreateFromFile(ECUFileName);
MemoryMappedViewStream stream = RawD.CreateViewStream();
BinaryReader RawB = new BinaryReader(stream);
我想要的代码是读取小数并将其放在datagridview中。 一个2mb的文件需要永远。
while (RawB.BaseStream.Position <= RawB.BaseStream.Length)
{
if (term == true) break;
DataGridViewRow row = (DataGridViewRow)DataG.Rows[0].Clone();
DataG.Rows.Add(row);
for (int P = 0; P < I; P++)
{
if (RawB.BaseStream.Position == RawB.BaseStream.Length) break;
Int16 Byte = RawB.ReadInt16();
string ByteStr = string.Format("{0}",Byte);
DataG[P, X].Value = ByteStr;
DataG[P, X].ReadOnly = true;
string ADR = string.Format("{0:x6}", X * 10); ;
DataG.Rows[X].HeaderCell.Value = ADR;
DataG.FirstDisplayedScrollingRowIndex = DataG.FirstDisplayedScrollingRowIndex + 1;
if (term == true) break;
}
我刚试过这个,似乎更快一点
byte[] bytes = File.ReadAllBytes(ECUFileName);
for (int i=0; i <= bytes.Length; i++)
{
string result = Convert.ToString(bytes[i]);
richTextBox1.AppendText(result);
}
是十六进制编辑器,不能用于我打算做的事情,所以我必须手动完成。
我已经阅读了很多文章,其中人们说用文件方法读取AllBytes,将文件存储在内存中, 当我尝试使用文件方法时,它也无法快速运行。
答案 0 :(得分:1)
我将DataGridView从工具箱放到Form上并使用了以下代码:
static void Demo(DataGridView dgv)
{
string src = @"C:\temp\currentData.txt";
var data = File.ReadAllBytes(src);
int nCols = 16; //number of columns to use in the DGV
DataTable dt = new DataTable();
for (int i = 0; i < nCols; i++)
{
dt.Columns.Add(new DataColumn { DataType = Type.GetType("System.Int16") });
}
var lastIndex = data.Length - nCols - 1;
for (int i = 0; i < lastIndex; i += nCols * 2)
{
var dr = dt.NewRow();
for (int j = 0; j <= nCols * 2 - 1; j += 2)
{
dr[j / 2] = BitConverter.ToInt16(data, i + j);
}
dt.Rows.Add(dr);
}
dgv.DataSource = dt;
}
private void Form1_Load(object sender, EventArgs e)
{
Demo(dataGridView1);
}
在不到一秒的时间内显示了人口稠密的DGV。 (使用旧的i7 920.)代码中的任何愚蠢(例如,逐个错误)是因为我从VB.NET手动翻译它。实际上,如果它不是一个完整的行,它不会显示最后一行数据。我只是证明这种方式更快。此外,如果文件的长度不是偶数个字节,则应进行适当的调整。
使其更快的重要部分是我填充DataTable以便稍后用作DGV的DataSource。
使用VirtualMode可能会更好地显示较大的文件(正如Hans Passant所建议的那样)。