2014-09-13 5 views
1

У меня есть странная проблема. Я хочу написать видимый textBox.Text в файл «ini» в FormClosing (прямо перед тем, как форма закрывается), поэтому я дважды щелкнул это событие в панели свойств основной формы и заполнил соответствующую функцию следующим образом:File.ReadAllText предотвращает закрытие формы при нажатии кнопки x

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. Если я просто остановлю отладку, содержимое файлов также не изменится.

EDIT:

Реальная проблема была функция, которую я использовал, чтобы найти и вернуть имя пользователя из ини файла:

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"; 
    } 

Содержание ини файла:

Имя пользователя = SomeName

Название бота = 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 Имя = SomeName

Любой намек на то, как ограничить string result только одну строку? Спасибо заранее!

+0

Вы уверены, что это не исключение? Например, похоже, что вы пытаетесь сохранить папку, а не файл? –

+1

Я не вижу расширения в вашем файле name.Btw, посмотрите на try/catch.Тогда, возможно, вы можете получить значащие сообщения об ошибках вместо замороженного окна. –

+0

Нет, нет ошибки вообще, и она не замерзает, она просто не реагирует на нажатие кнопки x и, таким образом, ничего не сохраняет в файле. – betaFlux

ответ

3

Это обычная ошибка в 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, установите флажок «Бросить». Отладчик теперь останавливается, когда генерируется исключение, что позволяет вам диагностировать и исправлять вашу ошибку.

+1

Woooooooot, это огромное, очень полезно знать. –

+0

Да, спасибо, очень полезно, но на самом деле была другая причина моей проблемы. Я обновил свой вопрос. – betaFlux

+0

Ну, конечно, как только вы знаете, как оживить отладчик, тогда просто найти реальную ошибку, не так ли? Вы опубликовали это сообщение? –

Смежные вопросы