Суббота, 05.10.2024, 10:29 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
Проблема с записью в бинарный файл
Волк-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 записать в файл. И я не могу сообразить, как это сделать...
Есть ещё варианты? cry

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;


А если уменьшить, то нельзя будет большие файлы пихать. ((( cry


Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Понедельник, 31.10.2011, 19:33
 
dolphinДата: Понедельник, 31.10.2011, 19:33 | Сообщение # 10
Администратор
Сообщений: 906
Статус: Offline
Сори, забыл про директиву
Code
{$M 1999999}
. Вставить нужно перед кодом.

Там в коде ещё косяк поправил один happy


Система: Windows 10 x64, Kali Linux
Среды программирования: Delphi 7, Delphi 10.x

Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
 
Волк-1024Дата: Понедельник, 31.10.2011, 19:36 | Сообщение # 11
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Хмм... Помогло. А что она делает? Я впервые вижу такую директиву. Спс.

----------------------------------
Всё. Теперь знаю, что она делает. (Google помог biggrin ).


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
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz