Как сохранить поток в файл в C #?

Все ответы не совсем правильные, попробуйте следующее:

select * from shirts where 1 IN (colors);
658
задан Nisarg 12 October 2018 в 10:21
поделиться

3 ответа

Вы не должны использование StreamReader для двоичных файлов (как gifs или jpgs). StreamReader для текст данные. Вы будете [почти 119], конечно теряют данные, если Вы используете их для произвольных двоичных данных. (Если Вы используете Кодирование. GetEncoding (28591) Вы, вероятно, будете хорошо, но какой смысл?)

, Почему необходимо использовать StreamReader вообще? Почему не только сохраняют двоичные данные как [1 110] двоичные данные и записывают его обратно к диску (или SQL) как двоичные данные?

РЕДАКТИРОВАНИЕ: Поскольку это, кажется, что-то, что люди хотят видеть..., если Вы делаете , просто хотят скопировать один поток в другого (например, в файл) используют что-то вроде этого:

/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8 * 1024];
    int len;
    while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, len);
    }    
}

Для использования его для дампа потока в файл, например:

using (Stream file = File.Create(filename))
{
    CopyStream(input, file);
}

Примечание, что Stream.CopyTo был представлен в.NET 4, служа в основном той же цели.

499
ответ дан Jon Skeet 12 October 2018 в 10:21
поделиться

Вот пример, который использует надлежащие использования и реализацию idisposable:

static void WriteToFile(string sourceFile, string destinationfile, bool append = true, int bufferSize = 4096)
{
    using (var sourceFileStream = new FileStream(sourceFile, FileMode.OpenOrCreate))
    {
        using (var destinationFileStream = new FileStream(destinationfile, FileMode.OpenOrCreate))
        {
            while (sourceFileStream.Position < sourceFileStream.Length)
            {
                destinationFileStream.WriteByte((byte)sourceFileStream.ReadByte());
            }
        }
    }
}

... и существует также это

    public static void WriteToFile(FileStream stream, string destinationFile, int bufferSize = 4096, FileMode mode = FileMode.OpenOrCreate, FileAccess access = FileAccess.ReadWrite, FileShare share = FileShare.ReadWrite)
    {
        using (var destinationFileStream = new FileStream(destinationFile, mode, access, share))
        {
            while (stream.Position < stream.Length) 
            {
                destinationFileStream.WriteByte((byte)stream.ReadByte());
            }
        }
    }

, ключ понимает надлежащее использование использования (который должен быть реализован на инстанцировании объекта, который реализует idisposable как показано выше), и наличие хорошей идеи относительно того, как свойства работают на потоки. Положение является буквально индексом в потоке (который запускается в 0), который сопровождается, поскольку каждый байт читается с помощью readbyte метода. В этом случае я по существу использую его вместо для переменной цикла и просто позволяю ему выполнить полностью до длины, которая является БУКВАЛЬНО концом всего потока (в байтах). Проигнорируйте в байтах, потому что это - практически то же, и у Вас будет что-то простым и изящным как это, которое разрешает все чисто.

Имеют в виду также, что метод ReadByte просто бросает байт к интервалу в процессе и может просто быть преобразован назад.

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

private void StreamBuffer(Stream stream, int buffer)
{
    using (var memoryStream = new MemoryStream())
    {
        stream.CopyTo(memoryStream);
        var memoryBuffer = memoryStream.GetBuffer();

        for (int i = 0; i < memoryBuffer.Length;)
        {
            var networkBuffer = new byte[buffer];
            for (int j = 0; j < networkBuffer.Length && i < memoryBuffer.Length; j++)
            {
                networkBuffer[j] = memoryBuffer[i];
                i++;
            }
            //Assuming destination file
            destinationFileStream.Write(networkBuffer, 0, networkBuffer.Length);
        }
    }
}

, объяснение довольно просто: мы знаем, что должны иметь в виду весь набор данных, которые мы хотим записать и также что мы только хотим записать определенные суммы, таким образом, мы хотим первый цикл с последним пустым параметром (то же как в то время как). Затем, мы инициализируем буфер массива байтов, который установлен на размер того, что передается, и со вторым циклом мы сравниваем j с размером буфера и размером исходного, и если это больше, чем размер исходного массива байтов, закончите выполнение.

0
ответ дан 22 November 2019 в 21:42
поделиться

Почему бы не использовать объект FileStream?

public void SaveStreamToFile(string fileFullPath, Stream stream)
{
    if (stream.Length == 0) return;

    // Create a FileStream object to write a stream to a file
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
    {
        // Fill the bytes[] array with the stream data
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int)bytesInStream.Length);

        // Use FileStream object to write to the specified file
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
     }
}
6
ответ дан 22 November 2019 в 21:42
поделиться
Другие вопросы по тегам:

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