Довольно простой сценарий. У меня есть веб-служба, которая получает массив байтов, который должен быть сохранен как определенный тип файла на диске. Каков наиболее эффективный способ сделать это на С#?
Каков наиболее эффективный способ сохранения массива байтов как файла на диске в С#?
Ответ 1
Это будет File.WriteAllBytes()
.
Ответ 2
System.IO.File.WriteAllBytes(path, data)
должен преуспеть.
Ответ 3
И WriteAllBytes просто выполняет
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
{
stream.Write(bytes, 0, bytes.Length);
}
BinaryWriter имеет вводящее в заблуждение имя, оно предназначено для записи примитивов в виде представлений байтов вместо написания двоичных данных. Весь его метод Write (byte []) выполняет функцию Write() в потоке, используя ее, в этом случае FileStream.
Ответ 4
Не уверен, что вы подразумеваете под "эффективным" в этом контексте, но я бы использовал System.IO.File.WriteAllBytes(строка, байт [] байты) - Конечно, эффективен с точки зрения LOC.
Ответ 5
Возможно, будут полезны классы System.IO.BinaryWriter и BinaryReader.
http://msdn.microsoft.com/en-us/library/system.io.binarywriter.aspx
"Записывает примитивные типы в двоичном виде в поток и поддерживает запись строк в определенной кодировке."
http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx
"Читает примитивные типы данных как двоичные значения в конкретной кодировке."
Ответ 6
У меня была аналогичная проблема, сбрасывающая массив байтов размером 300 МБ в файл диска...
Я использовал StreamWriter, и мне потребовалось 30 минут, чтобы сбросить файл.
Использование FilePut заняло около 3-4 минут, и когда я использовал BinaryWriter, файл был сброшен через 50-60 секунд.
Если вы используете BinaryWriter, вы получите лучшую производительность.
Ответ 7
На самом деле наиболее эффективным способом было бы передавать данные и записывать их по мере их получения. WCF поддерживает потоковое вещание, поэтому это может быть то, что вы хотели бы изучить. Это особенно важно, если вы делаете это с большими файлами, так как вы почти наверняка не хотите, чтобы содержимое файла в памяти было как на сервере, так и на клиенте.