Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.04 c
14-1106412939
thaddy
2005-01-22 19:55
2005.02.13
A bit off topic, but kol related!


3-1106040041
Russko
2005-01-18 12:20
2005.02.13
ComboBox и БД


1-1106830140
Карелин Артем
2005-01-27 15:49
2005.02.13
Как быстрее отловить завершение работы в Windows?


4-1104240928
BVV
2004-12-28 16:35
2005.02.13
WinExec


4-1104265790
slart
2004-12-28 23:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский