Форум: "Основная";
Текущий архив: 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