Загрузите файл с HttpClient, но отложите запись - PullRequest
0 голосов
/ 27 января 2020

Я могу скачать байты [] и записать их в файл без проблем, большая ссылка, эта ссылка делает . Но когда я делаю простое изменение, сохраняя байты [] и readCount в список, а затем перенаправляя его по списку, я получаю поврежденный файл.

Ниже приведен частичный код, который показывает, что я имею в виду. Есть два прокомментированных пути: один хранит байты / счетчики (и порядок), а затем записывает, когда чтение завершено. Другой пишет в соответствии с каждым прочитанным.

Из-за поля порядка я убедился, что foreach записывает байты в правильном порядке, но в листинге частичного кода он явно не используется.

    private class ByteHolder
    {
        public byte[] Buffer { get; set; } = new byte[8192];
        public int BytesRead { get; set; }
        public int Order { get; set; }
    }

    var byteList = new List<ByteHolder>();

    using (var fileStream = new FileStream(_fileBytes.SavingPath.RuntimePath(), FileMode.Create, FileAccess.Write, FileShare.None, 8192, true))
    {
        do
        {
            var bytesRead = await contentStream.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead == 0)
            {

                //--- WRITING THE bytes and counts this way produces corrupt file -->
                var offset = 0;
                foreach (var byteHolder in byteList)
                {
                    await fileStream.WriteAsync(byteHolder.Buffer, offset, byteHolder.BytesRead).ConfigureAwait(false);
                    offset += 8192;
                }

                isMoreToRead = false;
                FileDownloadComplete?.Invoke(this, _fileBytes);
                continue;
            }

            //--- Storing them in this class and list for writing above DOES NOT WORK -->
            byteList.Add(new ByteHolder() { Buffer = buffer, BytesRead = bytesRead, Order = readCount }); 

            //--- Writing inline with the read WORKS -->
            //await fileStream.WriteAsync(buffer, 0, bytesRead);

            readCount++;
            totalBytesRead += bytesRead;

1 Ответ

0 голосов
/ 27 января 2020
            foreach (var byteHolder in byteList)
            {
                var offset = 0;
                await fileStream.WriteAsync(byteHolder.Buffer, offset, byteHolder.BytesRead).ConfigureAwait(false);
                offset += 8192;
            }

Вы всегда пишете со смещением 0, независимо от того, какой byteHolder экземпляр вы обрабатываете в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...