Проблема с записью в бинарный файл
| |
Волк-1024 | Дата: Пятница, 28.10.2011, 17:51 | Сообщение # 1 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Здравствуйте. Возникла проблема с записью структуры в файл.
Есть кусок кода: Code
PackedFile = record Name: string[255]; Size: integer; Path: string[255]; Hash: string[255]; _File: file of byte; end;
function GetFileSizeEx(const Path: string): Integer; var FD: TWin32FindData; FH: DWORD; begin FH:=FindFirstFile(PChar(Path), FD); Result:=0; if FH=INVALID_HANDLE_VALUE then exit; Result:=FD.nFileSizeLow; if ((FD.nFileSizeLow and $80000000)<>0)or (FD.nFileSizeHigh<>0) then Result:=-1; end;
function WriteFileInPf(FN, _PF: pchar): integer; var tfile: PChar; ofs: _OfStruct; pf: PackedFile; pff: file of PackedFile; fs, fs2, i, flag: integer; NB, EB: array of ansistring; FBuff: array[0..1024] of byte; HF, OFL, Read, Write, W: DWORD; begin Result:=0; tfile:=(''); if pos(('.pf'), (string(_PF)))>0 then tfile:=(_PF) else Result:=(-1); if ((FileAge(FN)<>-1)=true) then begin FS:=(GetFileSizeEx(string(FN))); FS2:=(GetFileSizeEx(string(tfile))); PF.Name:=(ExtractFileName(FN)); PF.Size:=FS; PF.Path:=(ExtractFilePath(FN)); PF.Hash:=(GetMD5(FN, 0)); HF:=CreateFile((tfile), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if HF>0 then begin SetFilePointer(HF, 1, nil, 0); OFL:=OpenFile((FN), ofs, OF_READ); if OFL>0 then flag:=0; {repeat ReadFile(OFL, FBuff, 1024, Read, nil); Move(FBuff, PF._File, 1024); WriteFile(HF, FBuff, 1024, Write, nil); until (Read=0)or(Write<>Read);} end; Read:=0; Write:=0; W:=0; CloseHandle(HF); Result:=( GetFileSizeEx(tfile)); end else Result:=(Result-2); Exit; end;
Вся проблема вот здесь: Code repeat ReadFile(OFL, FBuff, 1024, Read, nil); Move(FBuff, PF._File, 1024); WriteFile(HF, FBuff, 1024, Write, nil); until (Read=0)or(Write<>Read);
Нужно переделать его так, чтобы в PF._File записались все байты из открытого ранее файла и затем эту структуру PackedFile записать в другой файл (.pf) ... Вся проблема в том, что в _File не правильно записываются байты, а точнее вообще ничего не пишет. Возможно, я не правильно определил тип для _File т.к если его заменить массивом _File Array[0..N] of byte то почти работает, но размер файла не известен, поэтому так нельзя. Долго уже над этим парюсь... Пробовал сделать с помощью AssignFile, BlockRead и BlockWrite всё работает! Но мне данный кусок нужно сделать на API. В итоге должен выйти файл формата (.dat) только (.pf) который будет использовать программа.
Собственно вопрос: как мне запихать файл в _File и потом эту структуру записать?
Извините за кашу. Заранее спасибо.
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Пятница, 28.10.2011, 22:45 |
|
| |
dolphin | Дата: Суббота, 29.10.2011, 11:02 | Сообщение # 2 |
Администратор
Сообщений: 906
Статус: Offline
| Code Move(FBuff, PF._File, 1024); эта строчка не нужна
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Волк-1024 | Дата: Суббота, 29.10.2011, 12:00 | Сообщение # 3 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Quote эта строчка не нужна В том и проблема... Мне нужно, чтобы в из FBuff скопировались байты в PF._File и затем всю структуру PackedFile записать в файл. И я не могу сообразить, как это сделать... Есть ещё варианты?
PS: как прочитать бинарный файл и как записать его я знаю ).
Pascal, C\C++, Assembler, Python
|
|
| |
Волк-1024 | Дата: Воскресенье, 30.10.2011, 13:25 | Сообщение # 4 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Фууух. Проблему решил.
Pascal, C\C++, Assembler, Python
|
|
| |
dolphin | Дата: Понедельник, 31.10.2011, 10:15 | Сообщение # 5 |
Администратор
Сообщений: 906
Статус: Offline
| Как решили проблему? Code type PBuf = ^TBuf; TBuf= array[1..BufSize] of Byte;
... var Size: integer; Buffer: PBuf;
... у меня с помощью ввода типа получилось
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Волк-1024 | Дата: Понедельник, 31.10.2011, 11:57 | Сообщение # 6 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Проблему решил иначе... Пришлось немного извратиться. Я изменил структуру на:
Code PackedFile = record Name: string[255]; Size: integer; Path: string[255]; Hash: string[255]; EP: integer; FP: integer; end;
В EP хранится адрес начала файла, который я хочу записать, а в FP соответственно его конец. Получилось так, что сначала записывается структура, а только потом пишется файл по этим адресам. P.S. Если предложите вариант проще буду только рад. )
Pascal, C\C++, Assembler, Python
|
|
| |
dolphin | Дата: Понедельник, 31.10.2011, 18:54 | Сообщение # 7 |
Администратор
Сообщений: 906
Статус: Offline
| Например так Доступно только для пользователей
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
Сообщение отредактировал dolphin - Понедельник, 31.10.2011, 19:34 |
|
| |
Волк-1024 | Дата: Понедельник, 31.10.2011, 19:05 | Сообщение # 8 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| ООО! Спасибо! +++
Pascal, C\C++, Assembler, Python
|
|
| |
Волк-1024 | Дата: Понедельник, 31.10.2011, 19:31 | Сообщение # 9 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Вот из-за этого вышибает Stack overflow: Code const BufSize = 1000000;
А если уменьшить, то нельзя будет большие файлы пихать. (((
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Понедельник, 31.10.2011, 19:33 |
|
| |
dolphin | Дата: Понедельник, 31.10.2011, 19:33 | Сообщение # 10 |
Администратор
Сообщений: 906
Статус: Offline
| Сори, забыл про директиву . Вставить нужно перед кодом.
Там в коде ещё косяк поправил один
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Волк-1024 | Дата: Понедельник, 31.10.2011, 19:36 | Сообщение # 11 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Хмм... Помогло. А что она делает? Я впервые вижу такую директиву. Спс.
---------------------------------- Всё. Теперь знаю, что она делает. (Google помог ).
Pascal, C\C++, Assembler, Python
Сообщение отредактировал Волк-1024 - Понедельник, 31.10.2011, 19:43 |
|
| |
dolphin | Дата: Понедельник, 31.10.2011, 19:49 | Сообщение # 12 |
Администратор
Сообщений: 906
Статус: Offline
| Она увеличивает размер стека . По умолчанию он 1 мегабайт. Можно так задать {$MAXSTACKSIZE размер в байтах}
Система: Windows 10 x64, Kali Linux Среды программирования: Delphi 7, Delphi 10.x
Я не профессионал, я всего лишь любитель Я не вредитель, я всего лишь теоретик
|
|
| |
Волк-1024 | Дата: Понедельник, 31.10.2011, 23:44 | Сообщение # 13 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| ЕЕЕЕЕЕЕЕЕ!!!!! Всё работает, наконец-то. Dolphin спасибо тебе. Теперь дело за малым…
Pascal, C\C++, Assembler, Python
|
|
| |
|