Как скопировать один Поток в массив байтов с самым маленьким кодом C#?

Если предполагается, что несколько человек в вашей организации должны быть уведомлены о сбое задания, вы можете изменить адрес электронной почты оператора, включив в него несколько почтовых ящиков, разделив каждый почтовый ящик точкой с запятой.

Я предполагаю, что ваш уведомленный оператор называется JobWatcher:

EXECUTE msdb.dbo.sp_update_operator
  @name = N'JobWatcher',
  @email_address = N'person1@company.org;person2@company.org';

Теперь person1@company.org и person2@company.org будут получать почту при сбое задания.

9
задан Jader Dias 4 June 2009 в 13:17
поделиться

4 ответа

Есть статический метод, который может сделать это за вас за один вызов.

var data = File.ReadAllBytes(fileName);

В качестве альтернативы, метод, который работает для любого потока (который возвращает его длину) будет:

byte[] data;
using (var br = new BinaryReader(stream))
    data = br.ReadBytes((int)stream.Length);

Для потоков, которые не имеют четко определенной длины (например, NetworkStream ), и, таким образом, вызывают исключение при вызове stream.Length это конечно не работает. Тогда вы, вероятно, захотите немного более сложное решение, представленное в ответе Джона Скита.

30
ответ дан 4 December 2019 в 05:51
поделиться

Как насчет одного:

byte[] result = File.ReadAllBytes(fileName);
27
ответ дан 4 December 2019 в 05:51
поделиться

Здесь довольно просто сократить количество строк кода (при этом можно работать с произвольными потоками, а не только с файлами):

using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
    int byteRead;
    while ((byteRead = fileStream.ReadByte()) != -1)
    {
        memoryStream.WriteByte(byteRead);
    }
    return memoryStream.ToArray();
}

Очевидно, что гораздо эффективнее читать в буфер, чем для чтения байта за раз, но это уменьшает количество операторов (поскольку вам не нужно объявлять как буфер , так и переменную для хранения возвращаемого значения из Stream). Вызов MemoryStream.ToArray () проще, чем чтение во вновь созданный массив.

Однако лучше использовать буфер. Обратите внимание, что нам действительно не нужен BinaryReader:

using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        memoryStream.Write(buffer, 0, bytesRead);
    }
    return memoryStream.ToArray();
}

Если вы хотите быть действительно жестоким, мы могли бы уменьшить количество с помощью операторов (с любым решением):

using (Stream fileStream = File.OpenRead(fileName),
              memoryStream = new MemoryStream())
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        memoryStream.Write(buffer, 0, bytesRead);
    }
    return ((MemoryStream)memoryStream).ToArray();
}

Но это просто гадко:

16
ответ дан 4 December 2019 в 05:51
поделиться

Не снижая LOC (я бы никогда не использовал это в качестве основной мотивации), вы можете свернуть использование следующим образом:

using (Stream fileStream = File.OpenRead(fileName))
using (BinaryReader binaryReader = new BinaryReader(fileStream))
using (MemoryStream memoryStream = new MemoryStream())
{
    byte[] buffer = new byte[256];
    int count;
    int totalBytes = 0;
    while ((count = binaryReader.Read(buffer, 0, 256)) > 0)
    {
        memoryStream.Write(buffer, 0, count);
        totalBytes += count;
    }
    memoryStream.Position = 0;
    byte[] transparentPng = new byte[totalBytes];
    memoryStream.Read(transparentPng, 0, totalBytes);    
}
8
ответ дан 4 December 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: