Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
[Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл |

26.05.2009, 15:17
|
|
Познающий
Регистрация: 20.11.2008
Сообщений: 32
Провел на форуме: 104649
Репутация:
39
|
|
[Delphi] скопировать кусок нужной длины из указанного места в файле в другой файл
надо скопировать с указанного места кусок нужной длины и сохранить в файл, как сделать? у меня уже моск кипит. собсно сами данные и их размер (RIFF WAVE) я нашёл, теперь проблема в том, чтобы сохранить
Код:
var
FHandle, FSave, SizeFile, BytesRW, RW: Cardinal;
l: Longint;
oldstring: string;
SIZE: DWORD;
wavsize:integer;
n: integer;
begin
FHandle := FileOpen('c:\1.bin', FmOpenRead);
OldString := 'RIFF';
n:=1;
SizeFile := GetFileSize(FHandle, nil);
for l := 0 to SizeFile - Length(oldstring) do
begin
FileSeek(FHandle, l, 0);
FileRead(FHandle, oldstring[1], 4);
if oldstring = 'RIFF' then
begin
FileSeek(FHandle, l + 4, 0);
Memo1.Lines.Add(IntToStr(l));
FileRead(FHandle, SIZE, 4);
Memo1.Lines.Add(IntToStr(SIZE));
FileSeek(FHandle, l , 0);
//тут сильно лажовый код =)
FileRead(FHandle,BytesRW,size);
FSave := CreateFile(pchar('_out'+Int2Digs(N, 4)+'.bmp'), GENERIC_WRITE,
0, nil, CREATE_ALWAYS, 0, 0);
WriteFile(FSave, BytesRW, SizeOf(BytesRW), RW, nil);
CloseHandle(FSave);
//вот
n:=n+1;
end;
Application.ProcessMessages;
end;
CloseHandle(FHandle);
end;
Последний раз редактировалось Jim_Di; 26.05.2009 в 15:24..
|
|
|

31.05.2009, 18:39
|
|
Познающий
Регистрация: 31.05.2009
Сообщений: 68
Провел на форуме: 1271980
Репутация:
19
|
|
надо скопировать с указанного места кусок нужной длины и сохранить в файл
Вот :
Код:
procedure _copy(FileNameIn: string ;// путь к входному файлу
const FileNameOut: string; // путь к выходному файлу
place, // позиция, откуда начать копировать
tocopy: integer); // сколько символов копировать
var
fin, fout: System.Text;
_in, _out: string;
s: string;
begin
If not FileExists(FileNameIn) then
exit;
AssignFile(fin, FileNameIn);
reset(fin);
AssignFile(fout, FileNameOut);
rewrite(fout);
_in:='';
_out:='';
while not EOF(fin) do begin
readln(fin, _in);
_out:=_out+_in;
end;
s:=copy(_out, place, tocopy);
writeln(fout, s);
CloseFile(fin);
CloseFile(fout);
end;
П.С. не самый шустрый алгоритм, писал "на коленке", но должно работать.
|
|
|

31.05.2009, 18:52
|
|
Познающий
Регистрация: 20.11.2008
Сообщений: 32
Провел на форуме: 104649
Репутация:
39
|
|
Спасибо за совет, думаю тое пригодиься кусок, гораздо проще и удобнее оказалось сделать TFileStream, там и придумывать ничего не надо - всё необходимое есть.
|
|
|

01.06.2009, 00:33
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
А вообще тут всё проще делается на API и выйдет примерно так
f1=CreateFile на чтение
f2=CreateFile на запись
SetFilePointer для f1 на нужную тебе позицию
GetMem чтобы выделить память под буфер размером чтобы вместились твои данные
ReadFile f1
WriteFile f2
CloseHandle f1
CloseHandle f2
FreeMem
|
|
|

01.06.2009, 07:30
|
|
Познающий
Регистрация: 20.11.2008
Сообщений: 32
Провел на форуме: 104649
Репутация:
39
|
|
вот за апи спасибо, попробую и так.
в принципе сейчас код работает нормально, парюсь с ускорением алгоритма поиска набора байт в файле
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|