Drakesal Ответов: 1

Как написать файл из cbytearray кусками


Всем привет

мне нужно написать файл из CByteArray, обычно я делаю это быстро:
Функция WriteFile(hFile, btMemArray-&ГТ;метода GetData(), dwBytesToWrite, &ампер;dwBytesWritten, нуль);

но теперь мне нужна панель прогресса, чтобы следить за извлечением, поэтому мне нужно читать куски из cbytearray и записывать в файл, но я не могу найти решение, Можете ли вы мне помочь?

Спасибо :)

Что я уже пробовал:

int nOffset = 0;

do
{
   bDone = WriteFile(hFile, btMemArray->GetData() + nOffset, 1, &dwBytesWritten, NULL);

   nOffset++;

} while (nOffset < btMemArray->GetSize());

<pre>

The my best was this at moment but i will need obviously bigger chunk than 1 help me to do this last step

Richard MacCutchan

Почему ты звонишь ZeroMemory когда CopyMemory сразу же переписывает нули?

Неясно, как вы координируете чтение (откуда?) и запись данных, или сколько фактических данных вы будете обрабатывать.

0x01AA

Нет никакой необходимости в другом буфере. CByteArray дает ли вам начальный адрес с GetData и длина массива с GetSize так что вы можете легко писать кусок за куском напрямую.

Drakesal

int nOffset = 0;

делать
{
сделано = функция WriteFile(hFile, btMemArray-&ГТ;метода GetData() + nOffset, 1, &ампер;dwBytesWritten, нуль);

nOffset++;

} while (nOffset < btMemArray->GetSize());

Я сделал этот прогресс, но как использовать с более высоким куском?

0x01AA

Смотрите ответ Ричарда, который выглядит очень хорошо.

Drakesal

Большое спасибо, Ричард, ты полностью решил мою проблему, благослови тебя Бог ;)

1 Ответов

Рейтинг:
7

Richard MacCutchan

Надо только позвонить GetSize и GetData один раз, прежде чем начать цикл. Затем вы можете использовать возвращенные значения для обхода буфера, записывая свои куски фиксированного размера. Что-то вроде:

int chunksize = 1024; // or whatever size you want
DWORD dwBytesWritten;

int arraySize = btMemArray->GetSize();
byte* pByte = btMemArray->GetData();

while (arraySize > 0)
{
    if (arraySize < chunksize)
    {
        chunksize = arraySize; // any final short block
    }
    WriteFile(hFile, pByte, chunksize, &dwBytesWritten, NULL);
    // check for errors here
    pByte += chunksize;
    arraySize -= chunksize; // reduce the amount left write
}


0x01AA

Выглядит нормально, +5

Richard MacCutchan

Мне пришлось переписать его несколько раз, так как мой мозг запутался. :(

0x01AA

У меня было решение через 5 минут после вас, но ваш код гораздо более читабелен, чем мой.
Мелочь, здесь точка с запятой слишком много btMemArray->;GetData();

Richard MacCutchan

Спасибо, поправил. Мой старый мозг и редактор сражаются - вы видите, кто победил.

0x01AA

:-) же здесь очень много времени. Кстати, теперь я вижу еще одну вещь: на всякий случай chunksize больше arraySize в начале следует ограничить его также в начале цикла.

Richard MacCutchan

Вы, конечно, правы. Так лучше?

0x01AA

Прекрасно!