File.ReadAllText阻止Form关闭x按钮

时间:2014-09-13 08:00:51

标签: c# formclosing writealltext

我有一个奇怪的问题。我想将可见的textBox.Text写入" ini"在FormClosing上的文件(在表单关闭之前),所以我在主窗体的“属性”面板下双击该事件,并按如下方式填充相关的函数:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        // store the whole content in a string
        string settingsContent = File.ReadAllText(settingsPath + "CBSettings");

        // replace a name with another name, which truly exists in the ini file 
        settingsContent.Replace(userName, userNameBox.Text);

        // write and save the altered content back to the ini file
        // settingsPath looks like this @"C:\pathToSettings\settingsFolder\"
        File.WriteAllText(settingsPath + "CBSettings", settingsContent);
    }

表单启动没有问题,但单击x按钮不会退出。它只在我评论File.WriteAllText行时正确关闭。如果我只是停止调试,文件内容也不会改变。

编辑:

实际问题是我用来查找和返回ini文件中的userName的函数:

    public static string GetTextAfterTextFromTextfile(string path, string file, string fileExtension, string textToLookFor)
    {
        string stringHolder;
        StreamReader sr = File.OpenText(path + file + fileExtension);
        while((stringHolder = sr.ReadLine()) != null)
        {
            if(stringHolder.Contains(textToLookFor))
            {
                return stringHolder.Replace(textToLookFor, "");
            }
        }
        sr.Close();
        return "Nothing found";
    }

ini文件的内容:

  

用户名= SomeName

     

Bot Name = SomeName

我从stackoverflow复制了上面的函数。我确信它有效,因为它捕获了“SomeName'就像我想要的那样。现在我使用另一个函数(也来自stackoverflow),在ini文件中搜索' User Name ='并返回它之后的文本。

    public static string GetTextAfterTextFromTextfile(string path, string textToSkip)
    {
        string str = File.ReadAllText(path);
        string result = str.Substring(str.IndexOf(textToSkip) + textToSkip.Length);
        return result;
    }

问题是,它返回

  

SomeNameBot Name = SomeName

有关如何将string result限制为仅一行的任何提示?非常感谢提前!

1 个答案:

答案 0 :(得分:3)

这是64位版本Windows 7的正常事故,由该操作系统的Wow64模拟器中的一个令人讨厌的缺陷引起。不仅限于Winforms应用程序,C ++和WPF应用程序也会受到影响。对于.NET应用程序,如果连接了调试器,这只会出错。 Repro代码:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    throw new Exception("You will not see this");
}

抛出异常时,调试器不会停止,您无法再关闭窗口。我在this post中写了一个关于这个问题的更广泛的答案,包括推荐的解决方法。

快速修复您的情况:使用Debug + Exceptions,勾选Thrown复选框。抛出异常时调试器现在停止,允许您诊断并修复您的错误。