Я открываю поток и затем десериализовываю данные в потоке. Однако я добавил участника к объекту SavedEventSet поэтому теперь, когда я пытаюсь открыть старый файл, он выдает исключение на строке десериализации.
Это меня устраивает (на данный момент), но проблема состоит в том, что я обрабатываю исключение, но никогда не закрываю поток (потому что исключение произошло, прежде чем я закрою поток), поэтому когда я попытаюсь открыть файл снова, это не позволит мне, потому что это используется.
Как я закрываю поток после этого исключения? Если я поместил поток. Близко () или в выгоде или в наконец, это жалуется на попытку получить доступ к неприсвоенной локальной переменной. Походит на плохую практику, чтобы просто открыть случайный файл, который я знаю, там. Там какой-либо путь состоит в том, чтобы открыть поток способом, который был бы подобен пустому конструктору, таким образом, будет похоже, что он присвоен?
Спасибо
SavedEventSet sES;
OpenFileDialog oFD = new OpenFileDialog();
Stream stream;
BinaryFormatter bF;
try
{
oFD.InitialDirectory = this.path;
oFD.Title = "Open Event Saved File.";
oFD.ShowDialog();
if(oFD.FileName.Contains(".sav"))
{
stream = File.Open(oFD.FileName, FileMode.Open);
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
stream.Close();
}
}
catch (Exception ex)
{
stream.Close();
/*handle Exception*/
}
Вы можете использовать , использующий блок , который автоматически закроет поток, даже если есть исключение:
using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
{
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
}
Используйте окончательно Блок, это будет выполнять, произошло ли исключение или нет:
try
{
oFD.InitialDirectory = this.path;
oFD.Title = "Open Event Saved File.";
oFD.ShowDialog();
if(oFD.FileName.Contains(".sav"))
{
stream = File.Open(oFD.FileName, FileMode.Open);
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
}
}
catch (Exception ex)
{
/*handle Exception*/
}
finally
{
if (stream != null)
stream.Close();
}
SavedEventSet sES;
OpenFileDialog oFD = new OpenFileDialog();
BinaryFormatter bF;
try
{
oFD.InitialDirectory = this.path;
oFD.Title = "Open Event Saved File.";
oFD.ShowDialog();
if(oFD.FileName.Contains(".sav"))
{
using(Stream stream = File.Open(oFD.FileName, FileMode.Open))
{
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
stream.Close();
}
}
}
catch (Exception ex)
{
/*handle Exception*/
}
Установите поток на ноль перед пробным блоком.
В вашем catch check if stream is not null, if not then close the stream.
SavedEventSet sES;
OpenFileDialog oFD = new OpenFileDialog();
Stream stream = null;
BinaryFormatter bF;
try
{
oFD.InitialDirectory = this.path;
oFD.Title = "Open Event Saved File.";
oFD.ShowDialog();
if (oFD.FileName.Contains(".sav"))
{
stream = File.Open(oFD.FileName, FileMode.Open);
bF = new BinaryFormatter();
sES = (SavedEventSet)bF.Deserialize(stream);
stream.Close();
}
}
catch (Exception ex)
{
if (stream != null)
stream.Close();
/*handle Exception*/
}