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

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

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

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

спасибо

5 ответов


можно использовать TempFileCollection класс:

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

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


вы можете получить временное имя файла с помощью 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);
}

другой подход здесь такой:

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

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

// now use that fileStream to save the xslx stream

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

Edit:

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

код будет такой:

string fileName = "file.txt";
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
}

// 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);

EDIT:

Извините, может быть, это только я, но я мог бы поклясться, что когда вы изначально разместили вопрос, у вас не было всех деталей о классе, реализующем IDisposable, и т. д... в любом случае, я не совсем уверен, что вы спрашиваете в своем (отредактированном?) вопрос. Но этот вопрос:--1--> довольно прямолинейно. Любое количество результатов google вернется для ".NET C# Stream to File" или такого.


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