【问题标题】:File.ReadAllText prevents Form from closing on x button clickFile.ReadAllText 防止表单在 x 按钮单击时关闭
【发布时间】:2014-09-13 08:00:51
【问题描述】:

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

    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 文件中查找并返回用户名的函数:

    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

机器人名称 = 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 限制为一行的任何提示?非常感谢!

【问题讨论】:

  • 你确定它没有抛出异常吗?例如,您似乎正在尝试保存到文件夹而不是文件?
  • 我在你的文件名中没有看到扩展名。顺便说一句,看看 try / catch。然后也许你会得到有意义的错误消息而不是冻结窗口。
  • 不,完全没有错误,它没有被冻结,它只是对单击 x 按钮没有反应,因此不会保存任何文件。
  • 尝试将新替换的内容存储在单独的字符串中,因为字符串是不可变的。通过您当前的编码替换的内容不会反映在新文件中。
  • 我尝试改用 StreamWriter,但它也不起作用,因为“streamWriter.Write(path)”行。我真的不知道该怎么办。

标签: c# formclosing writealltext


【解决方案1】:

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

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

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

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

【讨论】:

  • Woooooooot,这是巨大的,知道非常有用。
  • 是的,谢谢,确实很有帮助,但实际上我的问题还有另一个原因。我更新了我的问题。
  • 好吧,当然,一旦您知道如何恢复调试器,那么找到真正的错误就很简单了,不是吗?你对这篇文章投了反对票吗?
  • 现在这不是愚蠢吗?不,汉斯,我没有对你的帖子投反对票,事实上我试图给它投赞成票,但我的声誉分数太低了。而且我什至没有恢复调试器,我只是改变了读取文件的方式,但仍然没有任何成功。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多