Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Размещение файла в оперативке   Найти похожие ветки 

 
MC_GMC ©   (2006-03-10 16:34) [0]

Как в делфи разместить целиком любой нетипизированный файл (например ехе) в оперативной памяти, получить на него указатель, но главное, чтобы байты файла разместились в ОП последовательно и ничем случайно не были затерты?


 
oldman ©   (2006-03-10 16:35) [1]


> чтобы байты файла разместились в ОП последовательно и ничем
> случайно не были затерты?


ну русский переведи...


 
Fay ©   (2006-03-10 16:35) [2]

ReadFile | CreateFileMapping & MapViewOfFile


 
Сергей М. ©   (2006-03-10 16:38) [3]


> Как в делфи разместить целиком любой нетипизированный файл
> (например ехе) в оперативной памяти


В общем случае - никак.

Следует говорить о размещении в виртуальной, а не оперативной памяти.

См., например,  CreateFileMapping , MapViewOfFile


 
Desdechado ©   (2006-03-10 16:50) [4]

может, проще TFileStream?
если с ним работать штатными методами, то никаких косяков не будет
а в оперативке не поместится любой файл, бо большой может быть


 
palva ©   (2006-03-10 21:41) [5]

В оперативной памяти выделить буфер под размер файла. Если удалось, то прочитать файл в этот буфер. Не знаю, что можно еще посоветовать.


 
Гаврила ©   (2006-03-10 22:00) [6]

А цель какая?
(судя по всему может TMemoryStream подойти)


 
Германн ©   (2006-03-11 01:35) [7]


> palva ©   (10.03.06 21:41) [5]
>
> В оперативной памяти выделить буфер под размер файла. Если
> удалось, то прочитать файл в этот буфер. Не знаю, что можно
> еще посоветовать.


А как? Как выделить буфер именно в оперативной памяти?


 
Гаврила ©   (2006-03-11 02:16) [8]


> Германн ©


> Сергей М. ©  

Вам не кажется, что вы увлеклись определениями?
тем более что "виртуальной" и "оперативной" - вообще категории разные
"не в зеленом а в лесном"


 
Германн ©   (2006-03-11 03:11) [9]


> Гаврила ©   (11.03.06 02:16) [8]
>
>
> > Германн ©
>
>
> > Сергей М. ©  
>
> Вам не кажется, что вы увлеклись определениями?
> тем более что "виртуальной" и "оперативной" - вообще категории
> разные
> "не в зеленом а в лесном"
> <Цитата>
>

Так тут сабж виноват. Имхо.
А я, лично, не увлекался ничем! (Мои любимые игрушки, не в счёт!)


 
antonn ©   (2006-03-11 07:11) [10]

var _M:TmemoryStream;
begin
_M:TMemorystream.create.
try
_M.loadfromfile("C:\1.txt");//грузим файл, любой, но лучше небольшой:)
//@_M - это что ли нужно?
finally
_M.free;
end;


 
Anatoly Podgoretsky ©   (2006-03-11 09:34) [11]

Desdechado ©   (10.03.06 16:50) [4]
Да и вообще об оперативной памяти говорить не приходится.


 
palva ©   (2006-03-11 11:29) [12]

Германн ©   (11.03.06 01:35) [7]
> А как? Как выделить буфер именно в оперативной памяти?

Вот этого я как раз не знаю. Я же написал, "если удалось". Насколько я понял автора, ему без разницы, где файл будет. Главное, чтобы на него была ссылка и со всем файлом можно было работать при помощи "ссылочной арифметики".


 
MC_GMC ©   (2006-03-14 16:33) [13]

palva, вы абсолютно правы! Нужно просто разместить этот файлик целиком, с сылкой типа pointer на начало этого файла. Пробовал использовать выделение памяти allocmem и затем процедуры blockread и blockwrite для чтения файла и записи на ЖД такого же. Одним словом делаю копию нетипизированного файла через ОП с использованием поинтеров. Все дело в том, что с поинтерами это не заработало (сделал через массив char), а нужно именно с ними.


 
Desdechado ©   (2006-03-14 17:11) [14]

тогда TFileStream самое простое
вернее 2 - один читать, другой писать


 
Fay ©   (2006-03-14 17:44) [15]

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;



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
2-1141573596
Новочеркасский Волк
2006-03-05 18:46
2006.03.26
Заставить TIdUDPServer отправлять текст.


9-1124121668
ArtemESC
2005-08-15 20:01
2006.03.26
DelphiX


1-1140595655
Zhekson
2006-02-22 11:07
2006.03.26
Как считать содержимое ячейки DBGrid?


2-1141733678
oleg__
2006-03-07 15:14
2006.03.26
TImageList


2-1141906952
Barsky
2006-03-09 15:22
2006.03.26
Форма поверх всех окон.