Я только что изменил свой проект C ++ / CLI, чтобы изменить способ синтаксического анализа его текстового файла config.ini.Но он по-прежнему обращается к файлу на диске так же, как и раньше:
StreamReader ^sr = gcnew StreamReader(CONFFILE_NAME);
String ^rdfl = sr->ReadToEnd();
sr->Close();
Теперь он не будет работать вне среды VS2008Express.Это WinForm, притворяющийся сервисом и должен оставаться в трее уведомлений, но вместо этого он просто мигает там значком по умолчанию, пока я не наведу на него мышь, верный признак того, что он уже ненормально завершился.Кстати, значок по умолчанию должен быть немедленно обновлен, поэтому я еще раз проверю этот момент.Я только что попытался очистить и восстановить.
Спасибо.
_ РЕДАКТИРОВАТЬ _
Он работает нормально, еслиКонфигурационного файла нет или он несовместим - появляется окно, и я ввожу правильный конфиг, и она выключается.Но он перезагружает данные конфигурации из файла из VS2008 и раньше извлекал их (хотя и с большой логической ошибкой в кодировании).
Вот код, следующий сразу за тем, что выложен выше:
int fore = 0;
int aft;
while (statsRead < 4) {
fore = rdfl->IndexOf(':', aft)+1;
if (fore == -1) break;
aft = rdfl->IndexOf('\n', fore);
if (aft == -1) break;
if (statsRead == 0) str1 = rdfl->Substring(fore, aft-fore)->Trim();
else if (statsRead == 1) str2 = rdfl->Substring(fore, aft-fore)->Trim();
else {
String ^tmpIntStr = rdfl->Substring(fore, aft-fore)->Trim();
int tmp_int;
if (Int32::TryParse(tmpIntStr, tmp_int)) {
switch (statsRead) {
case 2: int1 = tmp_int; break;
case 3: int2 = tmp_int; break;
}
} else break;
}
++statsRead;
}
}
после этого всем остальным показателям присваиваются значения по умолчанию, которые работают в моем случае, кроме первого, которое вызывает окно.
_ РЕДАКТИРОВАТЬ _
Я обновил вышеупомянутое с помощью блоков try и catch, как того требует Hans, а также MSDN literatur для StreamReader, но все равно он не работает, трассировка стека (спасибо, Hans) указывает, что ошибка - это мой оператор while
(нет, спасибо, Мс)
if (File::Exists(CONFFILE_NAME)) {
String ^rdfl;
try {
StreamReader ^sr = gcnew StreamReader(CONFFILE_NAME);
try{
rdfl = sr->ReadToEnd();
} finally {
if ( sr )
delete (IDisposable^)sr;
}
} catch (Exception ^ex) {
MessageBox::Show(ex->Message);
}
int fore = 0;
int aft;
while (statsRead < 4) {
fore = rdfl->IndexOf(':', aft)+1;
if (fore == -1) break;
aft = rdfl->IndexOf('\n', fore);
if (aft == -1) break;
if (statsRead == 0) str1 = rdfl->Substring(fore, aft-fore)->Trim();
else if (statsRead == 1) str2 = rdfl->Substring(fore, aft-fore)->Trim();
else {
String ^tmpIntStr = rdfl->Substring(fore, aft-fore)->Trim();
int tmp_int;
if (Int32::TryParse(tmpIntStr, tmp_int)) {
switch (statsRead) {
case 2: int1 = tmp_int; break;
case 3: int2 = tmp_int; break;
}
} else break;
}
++statsRead;
}
}