Как мне исправить мое "system.indexoutofrangeexception"?
У меня есть основная форма, которая открывает дочернюю форму. У меня есть процедура в MainForm.cs для создания 2 подкаталогов и 1 текстового файла. В декларации форму mainform(), я добавил код, чтобы запустить мою функцию "createSSMonitorSubDirectories();"
void createSSMonitorSubDirectories() { if (!System.IO.Directory.Exists(@"Saved")) { System.IO.Directory.CreateDirectory(@"Saved"); } if (!System.IO.Directory.Exists(@"config")) { System.IO.Directory.CreateDirectory(@"config"); if(!System.IO.File.Exists(@"config\config.txt")) { var configFile = System.IO.File.Create(@"config\config.txt"); configFile.Close(); string defaultText = ("IP Address: 012.345.678.901\r\nDevice Port: 1111\r\nLog Directory: Saved\\\r\nConfig Directory: config\\\r\nEnter Modules here.\r\n"); System.IO.File.WriteAllText(@"config\config.txt", defaultText); } } }
У меня есть кнопка, при нажатии на которую отображается дочерний диалог.
void ConfigbuttonClick(object sender, EventArgs e) { var ccf = new configConnection(); ccf.ShowDialog(this); }
С помощью приведенного выше кода я получаю завершение работы программы со следующим сообщением:
Система.Indexoutofrangeexception: индекс находился вне границ массива.
в SS_BusMonitor.configConnection.fillInConfigForm()
Функция fillInConfigForm() запускается сразу же после активации дочерней формы. Вот код.:
void fillInConfigForm() { try{ string[] lines = System.IO.File.ReadAllLines(@"config\config.txt"); var trimCharsIP = "IP Address:"; var trimmedIP = lines[0].TrimStart(trimCharsIP.ToCharArray()); deviceIPAddress.Text = trimmedIP; var trimCharsPort = "Device Port:"; var trimmedPort = lines[2].TrimStart(trimCharsPort.ToCharArray()); devicePortNumber.Text = trimmedPort; var trimLogDirectory = "Log Directory:"; var trimmedLD = lines[4].TrimStart(trimLogDirectory.ToCharArray()); logDirectory.Text = trimmedLD; var trimConfigDirectory = "Config Directory:"; var trimmedCD = lines[6].TrimStart(trimConfigDirectory.ToCharArray()); configDirectory.Text = "C:" + trimmedCD; for(int i = 8; i < lines.Length; i++) { string nextLine = (lines[i]); this.moduleNamesList.Text += nextLine + "\n"; } } catch (ArgumentNullException e2) { MessageBox.Show("Load Config Defaults: " + e2.Message, "SS Bus Monitor", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Что я уже пробовал:
Когда я закомментирую весь код в операторе try, появится дочерняя форма, и я смогу редактировать и сохранять ее поля. Кроме того, когда я комментирую оператор MainForm и имею подкаталоги и config.txt файл тогда все работает так, как задумано.
Я прочитал все другие подобные ошибки, но ни одна из них, похоже, не является моей проблемой. Я потратил почти 6 часов на чтение, поиск и поиск решений. Пожалуйста, направьте меня к ответу.
Я думаю, что мне нужно повторно инициализировать новое утверждение, но у меня закончились идеи. Есть предложения? Похоже, это конфликт между WriteAllText и ReadAllLines. Правильно ли я думаю? Что такое "исправление"?
ТИА
Christiaan van Bergen
Ошибка: "система.IndexOutOfRangeException: Index was outside the bounds of the array" lets me believe that are not enough lines in your config.txt файл. Потому что, не проверяя количество строк, вы пытаетесь получить доступ к строкам в массиве. Не могли бы вы проверить это или, может быть, даже поделиться содержимым этого config.txt досье?
mygearstationcom
Я могу использовать то же самое config.txt файл, который я создаю с помощью WriteAllText, когда я комментирую строку createSSMonitorSubDirectories(); в подпрограмме MainForm. Моя проблема возникает, когда я пишу config.txt а затем попробуйте прочитать из него сразу же после этого. Я согласен с обоими ответами, что "это проблема индекса"
Вот содержание этой книги: config.txt:
IP-адрес: 012.345.678.901
Порт Устройства: 1111
Каталог Журнала: Сохранен\
Каталог конфигурации: config\
Введите модули здесь.
Поможет ли поиск термина "C# how to reset index after WriteAllText" в интернете приблизить меня к решению этой проблемы? Или мне нужно искать в другом месте? Мне кажется, что сообщение об ошибке, которое я получаю, может быть вызвано моими многими вещами.
Christiaan van Bergen
Я не думаю, что это имеет отношение к WriteAllText. У вас есть config.txt файл всего с 5 строками. Но вы пытаетесь прочитать строки 7 и 8. действительно, я думаю, что это ваша проблема с этим кодом. Это строка: var trimmedCD = lines[6].TrimStart(trimConfigDirectory.ToCharArray());
mygearstationcom
Спасибо за вашу терпимость и отличные ответы. Я понимаю, что ты имеешь в виду. Я также понимаю, почему мне нужно было читать четные числовые строки. Это произошло из-за разделения линий.
Можно ли было бы добавить больше строк, чтобы общее число было больше 8 строк? Будет ли этот код работать во время запуска моей программы?
Я попробую это завтра, чтобы посмотреть, как это работает.
Спасибо снова.