C#Windows窗体二进制文件
我有一个在用户重置密码时调用的方法。在执行时,应该查看二进制文件“PlayerDetails.bin”中是否存在用户 代码按预期工作,密码重置,但仍会引发错误: 类型为“System.ObjectDisposedException”的未处理异常 发生在mscorlib.dll中。其他信息:无法访问已关闭的文件C#Windows窗体二进制文件,c#,binaryfiles,C#,Binaryfiles,我有一个在用户重置密码时调用的方法。在执行时,应该查看二进制文件“PlayerDetails.bin”中是否存在用户 代码按预期工作,密码重置,但仍会引发错误: 类型为“System.ObjectDisposedException”的未处理异常 发生在mscorlib.dll中。其他信息:无法访问已关闭的文件 公共静态bool重置密码(字符串用户名、字符串密码) { //打开文件进行读写 长pos=-1; bool-found=false; 播放器读取播放器; 圣溪; 尝试 { st=File.
公共静态bool重置密码(字符串用户名、字符串密码)
{
//打开文件进行读写
长pos=-1;
bool-found=false;
播放器读取播放器;
圣溪;
尝试
{
st=File.Open(“PlayerDetails.bin”,FileMode.Open,FileAccess.ReadWrite);
BinaryFormatter bf=新的BinaryFormatter();
while(st.位置
移动st.Close();st.Dispose()
退出while循环
Stream st= null;
try
{
st = File.Open("PlayerDetails.bin", FileMode.Open, FileAccess.ReadWrite);
BinaryFormatter bf = new BinaryFormatter();
try
{
while (st.Position < st.Length && !found)
{
pos = st.Position;
readPlayer = (Player)bf.Deserialize(st);
if (readPlayer.username.CompareTo(username) == 0)
{
found = true;
readPlayer.password = password;
st.Seek(pos, SeekOrigin.Begin);
bf.Serialize(st, readPlayer);
}
}
}
finally
{
if(st != null)
{
st.Close();
st.Dispose();
}
}
}
Stream st=null;
尝试
{
st=File.Open(“PlayerDetails.bin”,FileMode.Open,FileAccess.ReadWrite);
BinaryFormatter bf=新的BinaryFormatter();
尝试
{
while(st.位置
如果您的while循环在第一次迭代后仍在执行,则它将尝试访问您在If语句末尾关闭的文件。这就是为什么会出现这个错误。您可以使用using
块:using(BinaryWriter bf=new BinaryWriter(File.Open(“PlayerDetails.bin”,FileMode.Open,FileAccess.ReadWrite))
旁注,根据MSFT,您不应该对流调用Close()。打电话给我。亚当,请记下德科的答案。在我发表评论之前,他有了正确的想法啊,我没有完全理解他的答案,我现在明白了@Sven。虽然我将继续在while循环之外使用代码,而不是最终使用。尝试过此操作后,在close下出现错误(但是dispose部分没有错误),“使用未分配的局部变量'st'”修复了此问题。您应该首先将st=null赋值。请改用using
块,此代码示例与编译器对该语句所做的几乎相同。
Stream st= null;
try
{
st = File.Open("PlayerDetails.bin", FileMode.Open, FileAccess.ReadWrite);
BinaryFormatter bf = new BinaryFormatter();
try
{
while (st.Position < st.Length && !found)
{
pos = st.Position;
readPlayer = (Player)bf.Deserialize(st);
if (readPlayer.username.CompareTo(username) == 0)
{
found = true;
readPlayer.password = password;
st.Seek(pos, SeekOrigin.Begin);
bf.Serialize(st, readPlayer);
}
}
}
finally
{
if(st != null)
{
st.Close();
st.Dispose();
}
}
}