Все это сводится к Вашему предпочтению.
у меня просто есть один большой монитор в моем домашнем офисе.
base.Dispose(disposing); // disposes the base stream so the file is no longer used
if (disposing)
File.Delete(m_TempFileName); // deletes the file
Вы должны добавить правильную обработку исключений для File.Delete, если вам нужно.
Это интересная идея, но в этом дизайне есть что-то, что меня беспокоит. Простите меня, если вы уже учли это в своем дизайне. Но если ваш проект представляет собой простую оболочку вокруг FileStream
, возникает тонкая, но, я думаю, серьезная проблема.
Если вы удаляете файл при закрытии потока, это означает, что единственная способ фактически использовать данные в файле, если FileAccess
равен ReadWrite
. Верный? Другими словами, вы будете использовать файл с кодом, который выглядит следующим образом:
using (TempFileStream t as new TempFileStream())
{
WriteDataToTempFile(t);
t.Seek(0, SeekOrigin.Begin);
ReadDataFromTempFile(t);
}
Я вижу проблему в том, что ReadDataFromTempFile
ожидает, что файл будет открыт для доступа для чтения, а не для чтения / записи. . И это открывает дверь для некоторых ошибок, которые, я думаю, будет очень сложно найти. Рассмотрим такой код:
using (TempFileStream t as new TempFileStream())
{
MyClass o = new MyClass(o);
o.TempStream = t;
o.ProduceOutput();
t.Seek(0, SeekOrigin.Begin);
o.ProcessOutput();
}
... по сравнению с этим:
MyClass o = new MyClass();
string n = Path.GetTempFileName();
using (FileStream s = new FileStream(n, FileMode.Create, FileAccess.Write))
{
o.TempStream = t;
o.ProduceOutput();
}
using (FileStream s = new FileStream(n, FileMode.Open, FileAccess.Read))
{
o.TempStream = t;
o.ProcessOutput();
}
File.Delete(n);
Конечно, первый метод короче второго. Но второй метод вызовет исключение, если ProcessOutput
вызывает метод, который записывает в TempStream
. (Или задает свойство, чей метод доступа set вызывает событие, обработчик событий которого отправляет вызов методу, который записывает в TempStream
, что, вероятно, и приведет к возникновению этой проблемы.) Первый вызов просто приведет к неожиданным результатам. без видимой причины.
Вы можете обойти это, я думаю, если ваш класс TempFileStream
откроет базовый FileStream
, используя FileAccess.Write
. Затем реализуйте метод Rewind
, который закрывает этот FileStream
и создает новый, использующий FileAccess.Read
. Если вы это сделаете, любой метод, который пытается выполнить запись в файл, когда он открыт для чтения (или наоборот), по крайней мере, вызовет исключение.
По сути, согласно логике TempFileStream вы всегда используете только что созданный файл с уникальным именем (это то, что делает Path.GetTempFileName), и вы всегда удаляете его после его использования. Поэтому нет необходимости предоставлять конструктор, принимающий FileMode, поскольку вы всегда используете его в одном и том же режиме.
Попробуйте вместо этого:
public class TempFileStream : FileStream
{
public TempFileStream()
: base(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.Read, 4096, FileOptions.DeleteOnClose) { }
public TempFileStream(FileAccess access)
: base(Path.GetTempFileName(), FileMode.Create, access, FileShare.Read, 4096, FileOptions.DeleteOnClose) { }
public TempFileStream(FileAccess access, FileShare share)
: base(Path.GetTempFileName(), FileMode.Create, access, share, 4096, FileOptions.DeleteOnClose) { }
public TempFileStream(FileAccess access, FileShare share, int bufferSize)
: base(Path.GetTempFileName(), FileMode.Create, access, share, bufferSize, FileOptions.DeleteOnClose) { }
}
Параметр FileOptions.DeleteOnClose гарантирует, что ОС автоматически удалит временный файл при закрытии файла. Нет необходимости в специальном методе Dispose, потому что обо всем этом позаботятся вы.