Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
15-1140894177
Nic
2006-02-25 22:02
2006.03.26
Лица форума


2-1142195886
kilop
2006-03-12 23:38
2006.03.26
Как приостановить процесс работы проги?


15-1141201191
McSimm
2006-03-01 11:19
2006.03.26
Funny UNIX Shell Commands


15-1141631228
konda
2006-03-06 10:47
2006.03.26
Вопрос по Excel


15-1140528782
Knight
2006-02-21 16:33
2006.03.26
Тут кто-нибудь парле по франсе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский