Форум: "Начинающим";
Текущий архив: 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.039 c