Обработка с временным потоком файла

Все это сводится к Вашему предпочтению.

у меня просто есть один большой монитор в моем домашнем офисе.

6
задан tshepang 13 March 2014 в 17:05
поделиться

4 ответа

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, если вам нужно.

2
ответ дан 8 December 2019 в 02:30
поделиться

Это интересная идея, но в этом дизайне есть что-то, что меня беспокоит. Простите меня, если вы уже учли это в своем дизайне. Но если ваш проект представляет собой простую оболочку вокруг 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 . Если вы это сделаете, любой метод, который пытается выполнить запись в файл, когда он открыт для чтения (или наоборот), по крайней мере, вызовет исключение.

5
ответ дан 8 December 2019 в 02:30
поделиться

По сути, согласно логике TempFileStream вы всегда используете только что созданный файл с уникальным именем (это то, что делает Path.GetTempFileName), и вы всегда удаляете его после его использования. Поэтому нет необходимости предоставлять конструктор, принимающий FileMode, поскольку вы всегда используете его в одном и том же режиме.

0
ответ дан 8 December 2019 в 02:30
поделиться

Попробуйте вместо этого:

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, потому что обо всем этом позаботятся вы.

26
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: