Создать временный файл из объекта потока в C # - PullRequest
8 голосов
/ 23 октября 2011

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

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

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

Спасибо

Ответы [ 5 ]

25 голосов
/ 23 октября 2011

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

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

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

8 голосов
/ 23 октября 2011

Другой подход здесь будет:

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
}
7 голосов
/ 23 октября 2011

Вы можете получить временное имя файла с помощью 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);
}
1 голос
/ 23 октября 2011
// 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" или тому подобное.

0 голосов
/ 23 октября 2011

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

...