C#二进制写入返回更大的文件
我的程序设置为加载SHIFT-JIS字符,并以相同的编码写入,但它返回的文件大小更大:s虽然我删除了几个字符,但以下是打开和保存代码:C#二进制写入返回更大的文件,c#,winforms,listview,binarywriter,C#,Winforms,Listview,Binarywriter,我的程序设置为加载SHIFT-JIS字符,并以相同的编码写入,但它返回的文件大小更大:s虽然我删除了几个字符,但以下是打开和保存代码: private void Openbtn_Click(object sender, EventArgs e) { listView1.Items.Clear(); textBox1.Text = ""; menuItem12.Text = "file type is: "; OpenFile
private void Openbtn_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
textBox1.Text = "";
menuItem12.Text = "file type is: ";
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "Open File";
ofd.Filter = "All Files (*.*)|*.*";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
menuItem13.Enabled = true;
menuItem14.Enabled = true;
menuItem15.Enabled = true;
path = ofd.FileName;
BinaryReader br = new BinaryReader(File.OpenRead(path), Encoding.GetEncoding("SHIFT-JIS"));
foreach (char mychar in br.ReadChars(4)) menuItem12.Text += mychar;
if (menuItem12.Text != "file type is: TXTD")
{
MessageBox.Show("This is not a TXTD file...", "Sorry", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
MessageBox.Show("File opened Succesfully!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
br.BaseStream.Position = 0x8;
int Pntrnum = br.ReadInt16();
menuItem11.Visible = true;
menuItem11.Text = Pntrnum.ToString();
List<int> offsets = new List<int>();
br.BaseStream.Position = 0x10;
for (int i = 0; i < Pntrnum; i++)
{
offsets.Add(br.ReadInt32());
}
Dictionary<int, string> values = new Dictionary<int, string>();
for (int i = 0; i < offsets.Count; i++)
{
int currentOffset = offsets[i];
int nextOffset = (i + 1) < offsets.Count ? offsets[i + 1] : (int)br.BaseStream.Length;
int stringLength = (nextOffset - currentOffset - 1);
br.BaseStream.Position = currentOffset;
var chars = br.ReadChars(stringLength);
values.Add(currentOffset, new String(chars));
}
foreach (int offset in offsets)
{
listView1.Items.Add(offset.ToString("X")).SubItems.Add(values[offset]);
}
br.Close();
br = null;
}
}
ofd.Dispose();
ofd = null;
}
private void Savebtn_Click(object sender, EventArgs e)
{
BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));
int number_pointers = Convert.ToInt32(menuItem11.Text);
Encoding enc = Encoding.GetEncoding("SHIFT-JIS");
bw.BaseStream.Position = 0x10;
int curr_pointer = 16 + number_pointers * 4;
//pointers writing
for (int i = 0; i < number_pointers; i++)
{
bw.Write(curr_pointer);
curr_pointer += enc.GetByteCount(listView1.Items[i].SubItems[1].Text) + '\0';
}
for (int i = 0; i < number_pointers; i++)
{
bw.Write(enc.GetBytes(listView1.Items[i].SubItems[1].Text + '\0'));
}
bw.Flush();
bw.Close();
bw = null;
}
private void Openbtn\u单击(对象发送者,事件参数e)
{
listView1.Items.Clear();
textBox1.Text=“”;
menuItem12.Text=“文件类型为:”;
OpenFileDialog ofd=新建OpenFileDialog();
ofd.Title=“打开文件”;
ofd.Filter=“所有文件(*.*)|*.*”;
if(ofd.ShowDialog()==System.Windows.Forms.DialogResult.OK)
{
menuItem13.Enabled=true;
menuItem14.Enabled=true;
menuItem15.Enabled=true;
path=ofd.FileName;
BinaryReader br=新的BinaryReader(File.OpenRead(path),Encoding.GetEncoding(“SHIFT-JIS”);
foreach(br.ReadChars(4)中的char mychar)menuItem12.Text+=mychar;
if(menuItem12.Text!=“文件类型为:TXTD”)
{
Show(“这不是TXTD文件…”,“对不起”,MessageBoxButtons.OK,MessageBoxIcon.Error);
返回;
}
其他的
{
Show(“文件已成功打开!”,“Info”,MessageBoxButtons.OK,MessageBoxIcon.Information);
br.BaseStream.Position=0x8;
int Pntrnum=br.ReadInt16();
menuItem11.Visible=true;
menuItem11.Text=Pntrnum.ToString();
列表偏移量=新列表();
br.BaseStream.Position=0x10;
对于(int i=0;i
非常感谢您的帮助。查看您提供的Samples.zip中的“After”文件似乎表明您正在输出相同的字符串两次,或者其他什么
我建议您从较小的文件开始测试,并使用调试器介入
事实上,我自己也试过了,我想我发现了问题所在:你使用“nextofset-currentfoset”作为stringLength,但实际上是字节长度。。。字符数组将在该数字的一半后结束(其中有一个“\0”),输出时,还将得到尚未读取的另一半
[编辑]
将我的评论中的代码发布到下面,以获得更好的格式:
int index;
for (index = 0; index < stringLength; ++index) if (chars[index] == '\0') break;
if (index < stringLength) {
char[] relevantPart = new char[index];
Array.Copy(chars, relevantPart, index);
chars = relevantPart;
}
int索引;
对于(索引=0;索引
查看您提供的Samples.zip中的“After”文件似乎表明您正在输出相同的字符串两次,或者其他什么
我建议您从较小的文件开始测试,并使用调试器介入
事实上,我自己也试过了,我想我发现了问题所在:你使用“nextofset-currentfoset”作为stringLength,但实际上是字节长度。。。字符数组将在该数字的一半后结束(其中有一个“\0”),输出时,还将得到尚未读取的另一半
[编辑]
将我的评论中的代码发布到下面,以获得更好的格式:
int index;
for (index = 0; index < stringLength; ++index) if (chars[index] == '\0') break;
if (index < stringLength) {
char[] relevantPart = new char[index];
Array.Copy(chars, relevantPart, index);
chars = relevantPart;
}
int索引;
对于(索引=0;索引
我不太明白open函数可能会对文件大小做什么,如果它改变了文件大小,那么该函数就犯了可怕的错误。。否则menuItem1总是一样的吗?menuItem1是openbtn,我只是把它重命名了,这样你们就可以说是哪个了,而且,我想也许我在OpenFunction中做错了什么,就像把日本字符读成UTF之类的东西,示例文件由您提供,先生。我建议您将保存功能复制到控制台应用程序中,并将.text
值更改为示例有效项sthat