Создание временного файла из объекта stream в c#

#c# #stream #idisposable #using

#c# #поток #idisposable #используя

Вопрос:

Учитывая объект stream, который содержит файл xlsx, я хочу сохранить его как временный файл и удалить его, когда файл больше не используется.

Я подумал о создании class этой реализации IDisposable и использовании ее с блоком using кода, чтобы удалить временный файл в конце.

Есть идеи о том, как сохранить поток во временный файл и удалить его по окончании использования?

Спасибо

Ответ №1:

Вы могли бы использовать класс TempFileCollection:

 using (var tempFiles = new TempFileCollection())
{
    string file = tempFiles.AddExtension("xlsx");
    // do something with the file here 
}
  

Что приятно в этом, так это то, что даже при возникновении исключения временный файл гарантированно будет удален благодаря using блокировке. По умолчанию файл будет сгенерирован во временную папку, настроенную в системе, но вы также можете указать пользовательскую папку при вызове TempFileCollection конструктора.

Ответ №2:

Вы можете получить имя временного файла с Path.GetTempFileName() помощью , создать FileStream для записи в него и использовать Stream.CopyTo для копирования всех данных из вашего входного потока в текстовый файл:

 var stream = /* your stream */
var fileName = Path.GetTempFileName();

try
{
    using (FileStream fs = File.OpenWrite(fileName))
    {
        stream.CopyTo(fs);
    }

    // Do whatever you want with the file here
}
finally
{
    File.Delete(fileName);
}
  

Ответ №3:

Другим подходом здесь было бы:

 string fileName = "file.xslx";
int bufferSize = 4096;

var fileStream = System.IO.File.Create(fileName, bufferSize, System.IO.FileOptions.DeleteOnClose)

// now use that fileStream to save the xslx stream
  

Таким образом, файл будет удален после закрытия.

Редактировать:

Если вам не нужно, чтобы поток существовал слишком долго (например: только одна операция записи или один цикл для записи …), вы можете, как было предложено, обернуть этот поток в блок using . При этом вам не придется удалять его вручную.

Код будет выглядеть так:

 string fileName = "file.xslx";
int bufferSize = 4096;

using(var fileStream = System.IO.File.Create(fileName, bufferSize, System.IO.FileOptions.DeleteOnClose))
{
    // now use that fileStream to save the xslx stream
}
  

Комментарии:

1. 1, не могли бы вы обернуть его в using блок. Безусловно, лучший ответ на данный момент.

2. Это способ сделать это, когда вам нужно иметь более длительный срок службы, чем можно выразить с помощью блока using .

Ответ №4:

 // Get a random temporary file name w/ path:
string tempFile = Path.GetTempFileName();

// Open a FileStream to write to the file:
using (Stream fileStream = File.OpenWrite(tempFile)) { ... }

// Delete the file when you're done:
File.Delete(tempFile);
  

Редактировать:

Извините, может быть, это только я, но я мог бы поклясться, что, когда вы изначально опубликовали вопрос, у вас не было всех подробностей о классе, реализующем IDisposable, и т. Д. … В любом случае, я не совсем уверен, что вы спрашиваете в своем (отредактированном?) вопрос. Но этот вопрос: Any idea of how to save the stream to temp file and delete it on the end of use? довольно прямолинейный. Любое количество результатов Google вернется для «.NET C # Stream to File» или тому подобное.

Ответ №5:

Я просто предлагаю для создания файла использовать Path.GetTempFileName() . но другие зависят от вашего использования senario, например, если вы хотите создать его в своем классе temp creator и использовать его только там, полезно использовать using ключевое слово.