Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Откуда беруться лишние байты при записи файла ?   Найти похожие ветки 

 
Фёдор Мегатронов   (2005-01-30 17:03) [0]

Вот кусок кода.

try
 AssignFile(endF, EndFileLabel.Caption);
 Rewrite(endF, 1);
except
 Application.MessageBox("Íåäîïóñòèìûå ñèìâîëû â èìåíè êîíå÷íîãî ôàéëà!","Îøèáêà!");
 Exit;
end;

AssignFile(partF, Part1Label.Caption);
Reset(partF, 1);

{ äåëàåì ïðàâèëüíûé ðàçìåð áóôôåðà è ðåàëèçóåì åãî}
if F1Size < BufSize
 then
  BufSize := F1Size;
GetMem(Buffer, BufSize);

Repeat
 BlockRead(partF, Buffer^, BufSize, OK);
 BlockWrite(endF, Buffer^, BufSize);
Until (OK < BufSize);

CloseFile(partF);

if DelParts
 then
  Remove(Part1Label.Caption);

AssignFile(partF, Part2Label.Caption);
Reset(partF, 1);

if F2Size < BufSize
 then
  BufSize := F2Size;
GetMem(Buffer, BufSize);

Repeat
 BlockRead(partF, Buffer^, BufSize, OK);
 BlockWrite(endF, Buffer^, BufSize);
 ZeroMemory(Buffer, BufSize);
Until (OK < BufSize);

CloseFile(partF);

if DelParts
 then
  Remove(Part2Label.Caption);

В результате если таким способом переписать два файла в один, то в конце первого куска образуеться кусок данных (левых) обьёмом равным Buffer или чуть меньше.

Тоесть я понимаю откуда он берёться (лишние данные) Функция BlockREad судя по всему в конце файла "отхватывает" лишний кусок несуществующих данных .(ну надо же чем-то буффер забить)
И записывает их как последний кусок.

Так вот мне не совсем понятно почему появляеться одил Лишний байт если размер Buffer я делаю в 1 байт ... Теоретически он должен прочитать последний байт первого куска и на этом остановиться, но он ещё раз дописывает лишний байт.

Если в цикл встроить ZeroMemory(Buffer, BufSize) , то лишний кусок из галемотьй превращаеться в нули. (так я собственно и определил что это из за буфера проблема)

Как это обойти ? я уже волосы на себе рву ...  но мне надо чтобы два (или более) файлов записывались в один работоспособный (т.к. изначально это куски на которые был поделён файл)


 
Anatoly Podgoretsky ©   (2005-01-30 17:21) [1]

Естественно, ты же пишешь всегда BufSize байт, вне зависимости от того сколько их есть реально.


 
Фёдор Мегатронов   (2005-01-30 17:23) [2]

так и чтож мне делать-то ?? можно засуннуть в цикл чтения/записи проверку ... но тогда эот отразиться на скорости работы


 
NE_Parovoz   (2005-01-30 17:56) [3]

Копируй все блоки кроме последнего, а потом копируй остаток.


 
Anatoly Podgoretsky ©   (2005-01-30 18:02) [4]

А как ты думаешь для чего у процедуры BlockRead четвертый параметр?


 
dimaxx ©   (2005-01-30 20:11) [5]

Repeat
BlockRead(partF, Buffer^, BufSize, OK);
BlockWrite(endF, Buffer^, OK);
ZeroMemory(Buffer, BufSize);
Until (OK < BufSize);



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.058 c
14-1106220358
uny
2005-01-20 14:25
2005.02.13
Aктивное микроканальное охлаждение


3-1105929565
D3m
2005-01-17 05:39
2005.02.13
SQL-запрос...


3-1105807473
Nata
2005-01-15 19:44
2005.02.13
изменить номера записи


1-1107175812
MakedoneZ
2005-01-31 15:50
2005.02.13
Вопрос по Графике параллельное и последовательное рисование.


4-1104025243
You
2004-12-26 04:40
2005.02.13
?? Параметризация TDialog офф ??