File.ReadAllText предотвращает закрытие формы при нажатии кнопки x

У меня странная проблема. Я хочу записать видимый textBox.Text в 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 только одной строкой? Спасибо заранее!


person betaFlux    schedule 13.09.2014    source источник
comment
Вы уверены, что это не исключение? Например, похоже, что вы пытаетесь сохранить в папку, а не в файл?   -  person Matthew Haugen    schedule 13.09.2014
comment
Я не вижу расширения в вашем имени файла. Кстати, загляните в try/catch. Тогда, возможно, вы сможете получать осмысленные сообщения об ошибках вместо зависшего окна.   -  person Selman Genç    schedule 13.09.2014
comment
Нет, вообще никакой ошибки, и он не зависает, он просто не реагирует на нажатие кнопки x и, следовательно, ничего не сохраняет в файле.   -  person betaFlux    schedule 13.09.2014
comment
попробуйте сохранить новое замененное содержимое в отдельной строке, поскольку строка неизменяема. В соответствии с вашей текущей кодировкой замененное содержимое не будет отражаться в новом файле.   -  person Sivakumar    schedule 13.09.2014
comment
Вместо этого я попытался использовать StreamWriter, но он также не работает из-за строки streamWriter.Write(path). Я действительно понятия не имею, что делать.   -  person betaFlux    schedule 13.09.2014
comment
@Sivakumar хорошо, я попробую.   -  person betaFlux    schedule 13.09.2014
comment
Вы читаете файл из TextProcessor.settingsPath, но записываете его в settingsPath - не знаю, одно и то же значение. Кроме того, эта строка settingsContent.Replace(userName, userNameBox.Text); на самом деле не изменит settingsContent, поэтому результирующий файл всегда будет неизменным.   -  person Lanorkin    schedule 13.09.2014
comment
@Lanorkin: Вы правы, я удалил часть TextProcessor ранее, но забыл одну, которая теперь должна исчезнуть. Что касается функции «Заменить», я не понимаю, как на самом деле изменить содержимое файла. Что мне делать?   -  person betaFlux    schedule 13.09.2014
comment
Спасибо Sivakumar, почти работает, теперь есть еще одна загадочная проблема. Все дело в файле с именем CBSettings.ini и если я попытаюсь написать в него, то форма не закроется. Если я пишу в CBSettings (без расширения .ini), создается как минимум Type-файл с правильным содержимым в правильной папке. Я сбит с толку. Windows Forms не поддерживает ini?   -  person betaFlux    schedule 13.09.2014
comment
Winforms поддерживает формат .ini. Можете ли вы опубликовать свой путь назначения?   -  person Sivakumar    schedule 13.09.2014
comment
Я объединил путь + файл, но проблема не устранена. public static string settingsPath = @"C:\MyWinform\CBSettings.ini";   -  person betaFlux    schedule 13.09.2014
comment
В целях тестирования попробуйте прочитать файл из каталога, отличного от C, где у вас есть права на чтение и запись, и запишите его в тот же каталог, где вы его читаете.   -  person Sivakumar    schedule 13.09.2014
comment
Ничего не меняет, но все равно спасибо за предложения. Сначала я рассмотрю свои пользовательские методы, которые я использую для чтения файла и объявления переменной userName. Что-то должно быть ужасно облажалось.   -  person betaFlux    schedule 13.09.2014


Ответы (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");
}

Отладчик не остановится, когда возникнет исключение, и вы больше не сможете закрыть окно. Я написал более подробный ответ об этой проблеме, включая рекомендуемые обходные пути, в этом сообщении.

Быстрое исправление в вашем случае: используйте Debug + Exceptions, поставьте галочку Thrown. Отладчик теперь останавливается при возникновении исключения, что позволяет вам диагностировать и исправить ошибку.

person Hans Passant    schedule 13.09.2014
comment
Ууууууууу, это очень важно, очень полезно знать. - person Matthias Müller; 13.09.2014
comment
Да, спасибо, действительно очень полезно, но на самом деле у моей проблемы была другая причина. Я обновил свой вопрос. - person betaFlux; 13.09.2014
comment
Ну, конечно, если вы знаете, как оживить отладчик, то найти настоящую ошибку несложно, не так ли? Вы минусовали этот пост? - person Hans Passant; 13.09.2014
comment
Разве это не было бы глупо? Нет, Ганс, я не минусовал твой пост, на самом деле я пытался его проголосовать, но мой рейтинг репутации слишком низкий. И даже отладчик не реанимировал, только изменил способ чтения файла, но все равно безуспешно. - person betaFlux; 13.09.2014