Главная страница
    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.043 c
1-1140945024
nap<>
2006-02-26 12:10
2006.03.26
Панель инструментов


1-1140678976
kyn66
2006-02-23 10:16
2006.03.26
Найти пароль в файле Excel.


15-1141329491
Aven
2006-03-02 22:58
2006.03.26
Разработка сервер WoW на Дельфи


2-1141681419
KILROY
2006-03-07 00:43
2006.03.26
Ссылка в БД...


11-1105701338
Bil Bal Dur
2005-01-14 14:15
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский