File.ReadAllText可防止单击x按钮时关闭窗体

本文关键字:窗体 按钮 ReadAllText 可防止 单击 File | 更新日期: 2023-09-27 18:21:41

我有一个奇怪的问题。我想写一个可见的文本框;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名称=SomeName

我从stackoverflow复制了上面的函数。我确信它成功了,因为它捕捉到了我想要的"SomeName"。现在我使用了另一个函数(同样来自stackoverflow),它在ini文件中搜索"用户名=",并返回紧随其后的文本

    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名称=SomeName

关于如何将string result限制为仅一行,有什么提示吗?非常感谢!

File.ReadAllText可防止单击x按钮时关闭窗体

这是64位版本的Windows7上的一个常见故障,由该操作系统的Wow64模拟器中的一个严重缺陷引起。不仅限于Winforms应用程序,C++和WPF应用程序也会受到影响。对于.NET应用程序,只有在附加了调试器的情况下,才会出现错误行为。Repro代码:

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

当抛出异常时,调试器不会停止,并且您无法再关闭窗口。我在这篇文章中写了一个关于这个问题的更广泛的答案,包括建议的解决方法。

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