...
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
TempStream.LoadFromFile('<file name here>');
Загрузка файла в память
Подскажите как прямиком в память загрузить файл и после загрузки получить на загруженные данные указатель.
Посмотри MapViewOfFile, может подойдет.
можно подробней об этой функции - в Win хелпе не понял как она работает
А не проще MemoryStream использовать?
Код:
Вроде бы так:)
MemoryStream я знаю - но как мне получить указатель на данные в МемориСтриме и насколько быстро работает Мемористрим
Цитата: Zbyszek
Да, согласен, MemoryStream полегче будет.
Вроде бы так:)
Код:
...
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
TempStream.LoadFromFile('<file name here>');
var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
TempStream.LoadFromFile('<file name here>');
Вроде бы так:)
Тока надо не забыть его удалить....
Чтобы получить данные - используй Read, SaveToFile, SaveToStream, Seek, WriteBuffer. К сожалению, ничего не могу сказать о скорости работы:(
Код:
var
FileHandle:Thandle;
point:pointer;
filesize,n:DWORD;
begin
filehandle:=createfile('.....',GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
filesize:=GetFileSize(FileHandle,nil);
point:=VirtualAlloc(0,filesize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
ReadFile(FileHandle,point^,filesize,n,0);
FileHandle:Thandle;
point:pointer;
filesize,n:DWORD;
begin
filehandle:=createfile('.....',GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
filesize:=GetFileSize(FileHandle,nil);
point:=VirtualAlloc(0,filesize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
ReadFile(FileHandle,point^,filesize,n,0);
ahilles, лучше уж MapViewOfFile, имхо...
Цитата: makbeth
лучше уж MapViewOfFile, имхо...
Почему?
полностью согласен с makbeth'ом. функция MapViewOfFile для этого и придумана, чтобы файлы в память отображать. а чем лучше? ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.
Цитата: kosfiz
полностью согласен с makbeth'ом. функция MapViewOfFile для этого и придумана, чтобы файлы в память отображать. а чем лучше? ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.
А она файлы в память заносит или просто образ делает?
Цитата: kosfiz
ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.
потому что, при свопинге (или как он там называется) мэпированная область памяти будет сброшена в искомый файл, а в моём примере она будет сброшена в файл подкачки как и любая другая непромэпированная память, в результате при использовании мэпирования файл подкачки не увеличивается.
Мэпирование наиболее эффективно при работе с большими файлами! а при работе с маленькими файлами лучше использовать мой пример
Все верно. Но мы же не в курсе для каких целей понадобилось автору загонять файл в память, а также какого он размера. Может ему и вовсе подойдет просто последовательное чтение? :))
Самый простой способ - это получить указатель из TMemoryStream - росто надо иногда мне надо внимательней читать хелпы) Хотя способ ahilesa'а тоже достаточно удобен.
Цитата: Crainov
Самый простой способ - это получить указатель из TMemoryStream - просто надо иногда мне надо внимательней читать хелпы) Хотя способ ahilesa'а тоже достаточно удобен.
Неа, ты получиш указатель на эксемпляр класса, а указатель на данные - это TMemoryStream.Memory
Но в хелпе ж написано что это указатель не на класс а на данные и не класса а на загруженные из файла ил потока. Тем более я этот способ проверил. Вот если так addr(MemoryStream) то тогда поинтер на класс.
Цитата: Crainov
Но в хелпе ж написано что это указатель не на класс а на данные и не класса а на загруженные из файла ил потока. Тем более я этот способ проверил. Вот если так addr(MemoryStream) то тогда поинтер на класс.
так скорее всего ты получишь указатель на переменную где экземпляр хранится, а не на класс