Главная страница
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.05 c
1-1106837943
Денис Шаров
2005-01-27 17:59
2005.02.13
Как поставить "Hook" на CDROM???


3-1105470462
Злой доброжелатель
2005-01-11 22:07
2005.02.13
IB(FB) vs Accsess


1-1107095142
ТехникПТО
2005-01-30 17:25
2005.02.13
Сохранение настроек программы


14-1105804147
Чеширский_Кот
2005-01-15 18:49
2005.02.13
Sourceforge.net


1-1106857576
Zloy SHREK
2005-01-27 23:26
2005.02.13
Как определить есть ли в приводе диск???