Главная страница
    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.46 MB
Время: 0.033 c
1-1107106394
Pointer
2005-01-30 20:33
2005.02.13
преобразования...


1-1106811370
s_pavell
2005-01-27 10:36
2005.02.13
Интересный модуль GraphicEx


8-1098701892
SNV-Soft
2004-10-25 14:58
2005.02.13
Качественная печать канвы формы


9-1099437966
Stivi
2004-11-03 02:26
2005.02.13
экран


1-1106976914
KyPCAHT
2005-01-29 08:35
2005.02.13
Реестр





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский