Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизОткуда беруться лишние байты при записи файла ? Найти похожие ветки
← →
Фёдор Мегатронов (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c