C#Windows窗体二进制文件

C#Windows窗体二进制文件,c#,binaryfiles,C#,Binaryfiles,我有一个在用户重置密码时调用的方法。在执行时,应该查看二进制文件“PlayerDetails.bin”中是否存在用户 代码按预期工作,密码重置,但仍会引发错误: 类型为“System.ObjectDisposedException”的未处理异常 发生在mscorlib.dll中。其他信息:无法访问已关闭的文件 公共静态bool重置密码(字符串用户名、字符串密码) { //打开文件进行读写 长pos=-1; bool-found=false; 播放器读取播放器; 圣溪; 尝试 { st=File.

我有一个在用户重置密码时调用的方法。在执行时,应该查看二进制文件“PlayerDetails.bin”中是否存在用户

代码按预期工作,密码重置,但仍会引发错误:

类型为“System.ObjectDisposedException”的未处理异常 发生在mscorlib.dll中。其他信息:无法访问已关闭的文件

公共静态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();
        }
    }
}