C#winform读取和写入文件越来越慢

知否,知否 2018-08-02 05:52:58
1.楼主是非计算机专业出身,C#学的非常浅,目前就用winform做小工具
2.我做了个Hex文件转Bin文件的小工具,以下是转换部分的源码
3.第一次运行没有问题,Hex文件成功的转换成了Bin文件,但是此时接着转换(还是用原来的Hex文件,Bin文件名也不变,理论上应该覆盖,但是这里并没有覆盖。而是追加到之前的Bin文件末尾???),这一次速度变慢了,每重复一次,速度就变慢一些,而且bin文件一直翻倍,并没有覆盖,同时Hex文件读取速度也越来越慢??? 但是如果关掉程序,重新运行,又好了,bin文件就被覆盖了,但是接着运行依然是刚才越来越慢的情况???
4.总结就是 每次转换都要重新运行程序才能进行下一次转换,否则Bin文件是追加而不是覆盖,而且速度越来越慢??

 private void Change()
{
if (textBox1.Text != "")
{
if (textBox2.Text != "")
{
this.Invoke(new EventHandler(delegate
{
this.Text = "Hex转Bin小工具(正在读取Hex,请稍等...)";
button2.Enabled = false;//失能转换按钮
button1.Enabled = false;//Hex文件锁定
button3.Enabled = false;//bin文件锁定
}));

try
{
StreamReader HexReader = new StreamReader(file.FileName);

while (true)
{
string szLine = HexReader.ReadLine(); //读取一行数据
if (szLine == null) //读完所有行
{
HexReader.Close();
break;
}
if (szLine.Substring(0, 1) == ":") //判断第1字符是否是:
{
if (szLine.Substring(1, 8) == "00000001")//数据结束
{
this.Invoke(new EventHandler(delegate
{
this.Text = "Hex转Bin小工具(Hex读取成功)";
}));
HexReader.Close();
break;
}
if (szLine.Substring(1, 1) == "1" || (szLine.Substring(3, 4) != "0000" && szLine.Substring(1, 1) == "0"))
{
szHex += szLine.Substring(9, szLine.Length - 11); //读取有效字符:后0和1
}
}
}
}
catch
{ }
Int32 i;
Int32 j = 0;
Int32 Length = szHex.Length;
byte[] szBin = new byte[Length / 2];
for (i = 0; i < Length; i += 2) //两字符合并成一个16进制字节
{
szBin[j] = (byte)Int16.Parse(szHex.Substring(i, 2), NumberStyles.HexNumber);
j++;
}
try
{
FileStream fs = new FileStream(Savefile.FileName, FileMode.Create);
//FileStream fs =File.Create(foldPath);
BinaryWriter bw = new BinaryWriter(fs);
this.Invoke(new EventHandler(delegate
{
this.Text = "Hex转Bin小工具(已转换0%)";

}));
for (int k = 0; k < j; k++)
{
bw.Write(szBin[k]);
this.Invoke(new EventHandler(delegate
{
this.Text = "Hex转Bin小工具(已转换" + ((int)(((float)k / (float)j) * 100)).ToString() + "%)";
}));
}
bw.Close();
fs.Close();
this.Invoke(new EventHandler(delegate
{
button3.Enabled = true;//可以重新选择bin文件
button2.Enabled = true;//使能转换按钮
button1.Enabled = true;//可以重新选择hex文件
}));
MessageBox.Show("转换完成", "提示");
}
catch
{ }
}
else
{
MessageBox.Show("请选择bin文件保存路径", "提示");
}
}
else
{
MessageBox.Show("请选择一个Hex文件", "提示");
}
}
...全文
701 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
知否,知否 2018-08-02
  • 打赏
  • 举报
回复
引用 2 楼 daixf_csdn 的回复:
szHex += szLine.Substring(9, szLine.Length - 11)

高频的字符串相加,效率低,使用StringBuilder


嗯 后面会改进!!
知否,知否 2018-08-02
  • 打赏
  • 举报
回复
引用 1 楼 StratosBlue 的回复:
szHex这个变量好像是全局的,它的内容在一直增加,尝试清空它的内容;


正解!!!谢谢了
圣殿骑士18 2018-08-02
  • 打赏
  • 举报
回复
szHex += szLine.Substring(9, szLine.Length - 11)

高频的字符串相加,效率低,使用StringBuilder
Anonymous477 2018-08-02
  • 打赏
  • 举报
回复
szHex这个变量好像是全局的,它的内容在一直增加,尝试清空它的内容;

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧