C#|进程无法访问该文件,因为它正被另一个进程使用,即使在关闭二进制写入程序和读取器之后

C#|进程无法访问该文件,因为它正被另一个进程使用,即使在关闭二进制写入程序和读取器之后,c#,binary,C#,Binary,我大约在3天前开始学习C#,之前我对Java有一些了解 这三天我一直在做一个程序,主要是为了掌握C#的窍门,这样我就可以学习,诸如此类 在这个程序中,只需更改文件中的几个字节,但这不是重点。关键是,我已经完成了所有这些工作,加载字节并将字节写入文件非常有效,除非。。当我在更改字节后关闭程序,并再次打开它后,我可以加载它们,但当我尝试保存时,我会出现此错误。进程无法访问文件“”,因为另一进程正在使用该文件“” 我绝对肯定它没有被用于其他用途,因为我打开的只有Opera、Visual Studio和

我大约在3天前开始学习C#,之前我对Java有一些了解

这三天我一直在做一个程序,主要是为了掌握C#的窍门,这样我就可以学习,诸如此类

在这个程序中,只需更改文件中的几个字节,但这不是重点。关键是,我已经完成了所有这些工作,加载字节并将字节写入文件非常有效,除非。。当我在更改字节后关闭程序,并再次打开它后,我可以加载它们,但当我尝试保存时,我会出现此错误。进程无法访问文件“”,因为另一进程正在使用该文件“”

我绝对肯定它没有被用于其他用途,因为我打开的只有Opera、Visual Studio和正在调试的程序。如果有用的话,这里是重要的部分(我知道,代码很糟糕,但我是新的..):

阅读/显示:

choose = Names.Items.IndexOf(Names.SelectedItem);
BinaryReader br = new BinaryReader(File.OpenRead(ofd.FileName));
br.BaseStream.Seek(BaseStats + (28 * choose), SeekOrigin.Begin);
HPtb.Text = br.ReadBytes(1)[0].ToString();
br.BaseStream.Seek(BaseStats + (28 * choose) + 1, SeekOrigin.Begin);
Attb.Text = br.ReadBytes(1)[0].ToString();
br.BaseStream.Seek(BaseStats + (28 * choose) + 2, SeekOrigin.Begin);
Deftb.Text = br.ReadBytes(1)[0].ToString();
br.BaseStream.Seek(BaseStats + (28 * choose) + 3, SeekOrigin.Begin);
Sptb.Text = br.ReadBytes(1)[0].ToString();
br.BaseStream.Seek(BaseStats + (28 * choose) + 4, SeekOrigin.Begin);
SpAtb.Text = br.ReadBytes(1)[0].ToString();
br.BaseStream.Seek(BaseStats + (28 * choose) + 5, SeekOrigin.Begin);
SpDtb.Text = br.ReadBytes(1)[0].ToString();
br.Close();
写作:

Names.Items.IndexOf(Names.SelectedItem);
BinaryWriter black = new BinaryWriter(File.OpenWrite(ofd.FileName));
black.BaseStream.Position = BaseStats + (choose  * 0x1C);
String[] statbox = new String[] { HPtb.Text, Attb.Text, Deftb.Text, Sptb.Text, SpAtb.Text, SpDtb.Text };
foreach (String element in statbox)
{
    black.Write((byte)int.Parse(element));
}
black.Close();
我得到错误的确切行是:

BinaryWriter black = new BinaryWriter(File.OpenWrite(ofd.FileName));
编辑:整个程序:(必须分开才能发布)


与此相关的行有:119、132、148和156

使用文件访问语句签出

using (FileStream fs = File.OpenRead(path)) 
{
    var br = new BinaryReader(fs);
    br.BaseStream.Seek(BaseStats + (28 * choose), SeekOrigin.Begin);
    HPtb.Text = br.ReadBytes(1)[0].ToString();
    br.Close();
}

您将希望处理该文件流。这是一种清晰、简单的方法,有助于确保。

欢迎使用堆栈溢出。我对你的问题进行了编辑。避免过于健谈,避免使用诸如“谢谢”之类的词语,因为它们在这里不合适。把你的完整代码,阅读文件的相关部分,它会让我们帮助你更多我们不喜欢关于pastebin代码片段的问题。将其精简为可以作为问题的一部分发布的内容。loadROMToolStripMenuItem\u单击不会关闭二进制读取器或给定的流。请检查所有与文件相关的对象,找出哪些对象可
IDisposable
,并确保所有对象都已被处置。是的,这意味着将从
file.OpenRead
获取的文件填充到它自己的变量中,并将其与
BinaryReader
分开处理。