mygearstationcom Ответов: 2

Как мне исправить мое "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 строк? Будет ли этот код работать во время запуска моей программы?

Я попробую это завтра, чтобы посмотреть, как это работает.

Спасибо снова.

2 Ответов

Рейтинг:
13

Pete O'Hanlon

Эта ошибка говорит вам, что вы обращаетесь к индексу, который не существует. Помните, что массивы в C# начинаются с 0, поэтому, если вам нужна 4-я строка, вы должны использовать 3 в качестве индексного номера.


mygearstationcom

Спасибо. Пожалуйста, смотрите мой комментарий к другому ответу. Я думаю, что мне нужно понять, как сбросить индекс. Я думаю, что когда я пишу, то добираюсь до конца. Затем я прочитал, начиная с этого момента, таким образом, ошибку. Должен ли мой вопрос звучать так: "как мне сбросить индекс обратно в начало?"

Рейтинг:
1

mygearstationcom

Ошибка исчезла после изменения моего кода следующим образом:

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.\nEnter Modules here.\nEnter Modules here.\n");
	System.IO.File.WriteAllText(@"config\config.txt", defaultText);


Спасибо за отличный ответ.