![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размещение файла в оперативке
MC_GMC © (2006-03-10 16:34:00)Как в делфи разместить целиком любой нетипизированный файл (например ехе) в оперативной памяти, получить на него указатель, но главное, чтобы байты файла разместились в ОП последовательно и ничем случайно не были затерты?
Fay (2006-03-14 17:44:00) [1]2 MC_GMC © (14.03.06 16:33) [13]
Так, что-ли?
function ReadTheFile(const cFileName : string; var p : PChar; var dwSize : DWORD) : Boolean;
var
h : THandle;
n : DWORD;
begin
Result := False;
h := CreateFile(PChar(cFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then
Exit;
try
p := nil;
dwSize := GetFileSize(h, nil);
if dwSize = INVALID_FILE_SIZE then
Exit;
GetMem(p, dwSize);
if not ReadFile(h, p^, dwSize, n, nil) then
Exit;
if n <> dwSize then
Exit;
Result := True;
finally
CloseHandle(h);
if not Result then
FreeMem(p);
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
p : PChar;
n : DWORD;
begin
if ReadTheFile('c:\boot.ini', p, n) then
begin
Application.MessageBox(p, nil, MB_OK);
FreeMem(p, n);
end;
end;
Desdechado (2006-03-14 17:11:00) [2]тогда TFileStream самое простое
вернее 2 - один читать, другой писать
MC_GMC (2006-03-14 16:33:00) [3]palva, вы абсолютно правы! Нужно просто разместить этот файлик целиком, с сылкой типа pointer на начало этого файла. Пробовал использовать выделение памяти allocmem и затем процедуры blockread и blockwrite для чтения файла и записи на ЖД такого же. Одним словом делаю копию нетипизированного файла через ОП с использованием поинтеров. Все дело в том, что с поинтерами это не заработало (сделал через массив char), а нужно именно с ними.
palva (2006-03-11 11:29:00) [4]Германн © (11.03.06 01:35) [7]
> А как? Как выделить буфер именно в оперативной памяти?
Вот этого я как раз не знаю. Я же написал, "если удалось". Насколько я понял автора, ему без разницы, где файл будет. Главное, чтобы на него была ссылка и со всем файлом можно было работать при помощи "ссылочной арифметики".
Anatoly Podgoretsky (2006-03-11 09:34:00) [5]Desdechado © (10.03.06 16:50) [4]
Да и вообще об оперативной памяти говорить не приходится.
antonn (2006-03-11 07:11:00) [6]var _M:TmemoryStream;
begin
_M:TMemorystream.create.
try
_M.loadfromfile('C:\1.txt');//грузим файл, любой, но лучше небольшой:)
//@_M - это что ли нужно?
finally
_M.free;
end;
Германн (2006-03-11 03:11:00) [7]
> Гаврила © (11.03.06 02:16) [8]
>
>
> > Германн ©
>
>
> > Сергей М. ©
>
> Вам не кажется, что вы увлеклись определениями?
> тем более что "виртуальной" и "оперативной" - вообще категории
> разные
> "не в зеленом а в лесном"
> <Цитата>
>
Так тут сабж виноват. Имхо.
А я, лично, не увлекался ничем! (Мои любимые игрушки, не в счёт!)
Гаврила (2006-03-11 02:16:00) [8]
> Германн ©
> Сергей М. ©
Вам не кажется, что вы увлеклись определениями?
тем более что "виртуальной" и "оперативной" - вообще категории разные
"не в зеленом а в лесном"
Германн (2006-03-11 01:35:00) [9]
> palva © (10.03.06 21:41) [5]
>
> В оперативной памяти выделить буфер под размер файла. Если
> удалось, то прочитать файл в этот буфер. Не знаю, что можно
> еще посоветовать.
А как? Как выделить буфер именно в оперативной памяти?
Гаврила (2006-03-10 22:00:00) [10]А цель какая?
(судя по всему может TMemoryStream подойти)
palva (2006-03-10 21:41:00) [11]В оперативной памяти выделить буфер под размер файла. Если удалось, то прочитать файл в этот буфер. Не знаю, что можно еще посоветовать.
Desdechado (2006-03-10 16:50:00) [12]может, проще TFileStream?
если с ним работать штатными методами, то никаких косяков не будет
а в оперативке не поместится любой файл, бо большой может быть
Сергей М. (2006-03-10 16:38:00) [13]
> Как в делфи разместить целиком любой нетипизированный файл
> (например ехе) в оперативной памяти
В общем случае - никак.
Следует говорить о размещении в виртуальной, а не оперативной памяти.
См., например, CreateFileMapping , MapViewOfFile
oldman (2006-03-10 16:35:00) [14]
> чтобы байты файла разместились в ОП последовательно и ничем
> случайно не были затерты?
ну русский переведи...
Fay (2006-03-10 16:35:00) [15]ReadFile | CreateFileMapping & MapViewOfFile