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

Вниз

Прочитать в TMemoryStream   Найти похожие ветки 

 
Still_Swamp   (2003-08-19 17:14) [0]

и так есть
MemoryStream:TMemoryStream;
FFileHandle:integer; хэндл файла открытого с помощью FileOpen

мне необходимо в поток загрузить блок данных из файла. как произвести чтение в этот самый Memory?

MemoryStream:=TMemoryStream.Create;
MemoryStream.SetSize(DataSize); //размер файла
FileSeek(FFileHandle, 0, 0);
FileRead(FFileHandle, MemoryStream.Memory, DataSize); //строка вопрос - как это рпавильно написать?

почему не воспользовался LoadFromFile сразу скажу.... потому что файл открыт.


 
Palladin   (2003-08-19 17:18) [1]

Ты думаешь FileStream действует по иному принциму чем собрался ты?


 
Still_Swamp   (2003-08-19 17:21) [2]

грузит что ли иначе?
Может и не иначе, но если файл открыт, на LoadFromFile он ругнется.

а после исполнения FileRead(FFileHandle, MemoryStream.Memory, DataSize) этой строки в стриме какая-то фигня оказывается.


 
[lamer]Barmaglot   (2003-08-19 17:24) [3]

Как ты собираешься читать файл, если его не может прочитать файл стриам?

ты вообще можешь считать этот файл например в память?


 
Skier   (2003-08-19 17:25) [4]

FileRead(FFileHandle, MemoryStream.Memory^, DataSize); ?


 
Metal Knight   (2003-08-19 17:26) [5]

AFAIK Memory - это read-only property

FileRead(FFileHandle, Buffer, DataSize);
MemoryStream.Write(Buffer, DataSize);


 
Still_Swamp   (2003-08-19 17:27) [6]

да - без проблем.
он мной же и открыт

FFileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareDenyNone);

но закрыть его на момент этой операции я не могу. перехватят.
мне надо прочитать в буфер его кусок. не обязательно весь и не обязательно с начала.


 
Still_Swamp   (2003-08-19 17:28) [7]

skier
пробовал.... тот же самый фифект.


 
[lamer]Barmaglot   (2003-08-19 17:32) [8]

Если можешь прочитать файл в память то какие проблемы? С памяти пишешь его в TMemoryStream.WriteBuffer - или я чего-то не понимаю?


 
Skier   (2003-08-19 17:32) [9]

>Still_Swamp © (19.08.03 17:28) [7]
1) Открывай через TFileStream
2) Копируй через TMemoryStream.CopyFrom(...)


 
Still_Swamp   (2003-08-19 17:33) [10]

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


 
jack128   (2003-08-19 17:34) [11]

var
handleStream : ThandleStream;
begin
HandleStream := ThandleStream.Create(FfileHandle);
// Вот тебе весь файл в потоке :-)
end;


 
Still_Swamp   (2003-08-19 17:36) [12]

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


 
[lamer]Barmaglot   (2003-08-19 17:36) [13]

Так зачем буфер? Ты куда данные из файла считываешь? Вот оттуда и кидай в мемори стреам. Или хочешь сразу в меморитреам? Тогда делай LoadFromStream тем которым открыл, либо убери эксклюзивное чтенее...


 
Still_Swamp   (2003-08-19 17:37) [14]

о! это любопытно
пошел смотреть


 
Still_Swamp   (2003-08-19 17:41) [15]

хм.... THandleStream - это тот же файл, а мне надо избавиться от множественного чтения.

у меня структурированный файл 100тыс записей. если делать чтение по записям - читается это около 8 сек. если загрузить все сразу в буфер а птом разодрать на структуру - это моментально.

вот я и озаботился, как бы это все прочитать за один присест.


 
Metal Knight   (2003-08-19 17:44) [16]

А зачем файл открытым держать?


 
Still_Swamp   (2003-08-19 17:45) [17]

а как только закрою - его кто нит к рукам приберет на эксклюзивный доступ


 
[lamer]Barmaglot   (2003-08-19 17:46) [18]

Читай файл в мемористриам ДО ТОГО, как откроешь его...


 
Still_Swamp   (2003-08-19 17:48) [19]

ну да... это я так проверил что оно все славно работает....

но читать надо периодически. а у меня еще работает процесс, которому придется пояснять, что файл видите-ли вздумали мы закрывать, потому как не можем иначе его прочитать. :(


 
Metal Knight   (2003-08-19 17:49) [20]

Как вариант:
FileRead(FFileHandle, Buffer, DataSize);
MemoryStream.SetPointer(Buffer, DataSize);


 
jack128   (2003-08-19 17:52) [21]

var
handleStream : ThandleStream;
ms : TmemoryStream;
begin
HandleStream := ThandleStream.Create(FfileHandle);
ms.CopyFrom(HandleStream,HandleStream.Size);
// Весь файл в памяти, при этом его никто не закроет...
// Хотя есть вопрос, если файл скопирован в память, то зачем его повторно читать??
end;


 
Still_Swamp   (2003-08-19 17:53) [22]

Буфер организовывать GetMem?
сейчас попробую.


 
Still_Swamp   (2003-08-19 18:04) [23]

У TMemoryStream SetPointer я не обнаружил. Он есть у TCustomMemoryStream, но это абстрактный класс.


 
jack128   (2003-08-19 18:07) [24]


> Still_Swamp © (19.08.03 18:04) [23]

:-)) Круто -))
Если метод есть в предке, то он есть и в потомке. Это называется наследованием.


 
Verg   (2003-08-19 18:31) [25]

MemoryStream:=TMemoryStream.Create;
MemoryStream.SetSize(DataSize);
FileSeek(FFileHandle, 0, 0);
FileRead(FFileHandle, MemoryStream.Memory^, DataSize);

Работает нормально!
Или у тебя где-то в другом месте ошибка.


 
Still_Swamp   (2003-08-19 18:47) [26]

сейчас еще раз перепроверю.


 
Still_Swamp   (2003-08-19 19:04) [27]

хм... и в правду работает...
:(((


 
Dred2k   (2003-08-19 20:44) [28]

Зачем такие навороты?
Есть TMemoryStream.LoadFromStream.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
1-1451
-=GaLaN=-
2003-08-18 15:24
2003.09.01
Подскажите ламеру как работать с указателями


6-1522
XHelp
2003-06-26 20:03
2003.09.01
ICQ через HTTP Proxy


6-1539
gala
2003-06-25 13:19
2003.09.01
Sockets Problem


3-1329
Fants
2003-08-11 09:47
2003.09.01
Документация по FIBPlus


7-1676
Fokin111
2003-06-18 17:20
2003.09.01
Интеграция





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский