У меня есть класс MyClass
, которому нужны данные из файла, который будет использоваться на протяжении всего запуска программы. Для чтения в данных у меня есть еще один класс OpenFileService
, производный от IDisposable
и использует BinaryReader
читать все данные:BinaryReader throws NullReferenceException при удалении
internal class OpenFileService : IDisposable
{
#region disposing data
bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Dispose(true);
GC.SuppressFinalize(this);
disposed = true;
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
br.Dispose();
}
}
~OpenFileService()
{
Dispose(false);
}
#endregion
internal event EventHandler ErrorInFileReadEventHandler;
internal event EventHandler SuccessfulFileReadEventHandler;
private BinaryReader br;
internal void OpenFile(object obj)
{
MyClass sender = obj as MyClass;
bool isWrongFormat = false;
try
{
br = new BinaryReader(File.Open((sender).fileName, FileMode.Open));
//read in header from file.
if (//header shows wrong file format)
{
isWrongFormat = true;
throw new System.Exception();
}
//read rest of file.
SuccessfulFileReadEventHandler(this,null);
}
catch
{
if (isWrongFormat)
MessageBox.Show("Wrong format.");
else
MessageBox.Show("Couldn't access.");
ErrorInFileReadEventHandler(this, null);
return;
}
finally
{
this.Dispose();
}
}
}
И он используется как таковой:
class MyClass
{
internal filePath; //assuming it has already been determined
internal ImageData(string filePath)
{
this.filePath = filePath;
OpenFileService ofs = new OpenFileService();
ofs.ErrorInFileReadEventHandler += new EventHandler(UnsuccessfulFileRead);
ofs.SuccessfulFileReadEventHandler += new EventHandler(SuccessfulFileRead);
Thread thread = new Thread(new ParameterizedThreadStart(ofs.OpenFile));
thread.IsBackground = true;
thread.Start(this);
}
}
Теперь, когда файл формат является неправильным, и я сам создаю исключение в блоке try
, все работает без проблем, но когда файл фактически не может быть доступен (например, с защитой от записи), br.Dispose();
создает NullReferenceException
, и я не могу понять, почему. Я действительно урезал код до его простых вещей, надеюсь, он не слишком длинный.
Редактировать: Возможный ответ можно найти из принятого ответа here в качестве рекомендуемого ответа Microsoft.
Может быть, у br остается значение null, потому что файл защищен от записи? – Jacob
Вау ... Я действительно пропустил эту мысль. Замена 'br.Dispose();' с 'if (br! = Null) br.Dispose();' похоже, решит его ... Спасибо, много! Я не могу поверить, что не думал об этом. – phil13131
u приветствуется. может случиться с кем угодно. – Jacob