Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загрузка файла в память

7.9K
20 августа 2007 года
Crainov
39 / / 04.06.2006
Подскажите как прямиком в память загрузить файл и после загрузки получить на загруженные данные указатель.
16K
20 августа 2007 года
Zbyszek
118 / / 08.08.2007
Посмотри MapViewOfFile, может подойдет.
7.9K
20 августа 2007 года
Crainov
39 / / 04.06.2006
можно подробней об этой функции - в Win хелпе не понял как она работает
286
20 августа 2007 года
misha_turist
572 / / 28.11.2005
А не проще MemoryStream использовать?
16K
20 августа 2007 года
Zbyszek
118 / / 08.08.2007
Да, согласен, MemoryStream полегче будет.
 
Код:
...
var
  TempStream : TMemoryStream;
begin
  TempStream := TMemoryStream.Create;
  TempStream.LoadFromFile('<file name here>');

Вроде бы так:)
7.9K
20 августа 2007 года
Crainov
39 / / 04.06.2006
MemoryStream я знаю - но как мне получить указатель на данные в МемориСтриме и насколько быстро работает Мемористрим
286
20 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: Zbyszek
Да, согласен, MemoryStream полегче будет.
 
Код:
...
var
  TempStream : TMemoryStream;
begin
  TempStream := TMemoryStream.Create;
  TempStream.LoadFromFile('<file name here>');

Вроде бы так:)



Тока надо не забыть его удалить....

16K
20 августа 2007 года
Zbyszek
118 / / 08.08.2007
Чтобы получить данные - используй Read, SaveToFile, SaveToStream, Seek, WriteBuffer. К сожалению, ничего не могу сказать о скорости работы:(
261
20 августа 2007 года
ahilles
1.5K / / 03.11.2005
вот так наверно
 
Код:
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);
303
21 августа 2007 года
makbeth
1.0K / / 25.11.2004
Crainov, у TMemoryStream есть свойство - указатель на область памяти (см. хелп внимательнее).
ahilles, лучше уж MapViewOfFile, имхо...
286
21 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: makbeth
лучше уж MapViewOfFile, имхо...



Почему?

257
21 августа 2007 года
kosfiz
1.6K / / 18.09.2005
полностью согласен с makbeth'ом. функция MapViewOfFile для этого и придумана, чтобы файлы в память отображать. а чем лучше? ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.
286
21 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: kosfiz
полностью согласен с makbeth'ом. функция MapViewOfFile для этого и придумана, чтобы файлы в память отображать. а чем лучше? ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.



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

261
21 августа 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: kosfiz
ну к примеру тем, что вариант с мэппирование работает почти в два раза быстрее.


потому что, при свопинге (или как он там называется) мэпированная область памяти будет сброшена в искомый файл, а в моём примере она будет сброшена в файл подкачки как и любая другая непромэпированная память, в результате при использовании мэпирования файл подкачки не увеличивается.
Мэпирование наиболее эффективно при работе с большими файлами! а при работе с маленькими файлами лучше использовать мой пример

303
22 августа 2007 года
makbeth
1.0K / / 25.11.2004
Все верно. Но мы же не в курсе для каких целей понадобилось автору загонять файл в память, а также какого он размера. Может ему и вовсе подойдет просто последовательное чтение? :))
7.9K
22 августа 2007 года
Crainov
39 / / 04.06.2006
Самый простой способ - это получить указатель из TMemoryStream - росто надо иногда мне надо внимательней читать хелпы) Хотя способ ahilesa'а тоже достаточно удобен.
286
22 августа 2007 года
misha_turist
572 / / 28.11.2005
Цитата: Crainov
Самый простой способ - это получить указатель из TMemoryStream - просто надо иногда мне надо внимательней читать хелпы) Хотя способ ahilesa'а тоже достаточно удобен.



Неа, ты получиш указатель на эксемпляр класса, а указатель на данные - это TMemoryStream.Memory

7.9K
22 августа 2007 года
Crainov
39 / / 04.06.2006
Но в хелпе ж написано что это указатель не на класс а на данные и не класса а на загруженные из файла ил потока. Тем более я этот способ проверил. Вот если так addr(MemoryStream) то тогда поинтер на класс.
268
23 августа 2007 года
Михаил
587 / / 25.06.2005
Цитата: Crainov
Но в хелпе ж написано что это указатель не на класс а на данные и не класса а на загруженные из файла ил потока. Тем более я этот способ проверил. Вот если так addr(MemoryStream) то тогда поинтер на класс.


так скорее всего ты получишь указатель на переменную где экземпляр хранится, а не на класс

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог