#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
ключевое слово.