Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: CL | DM;

Вниз

Прочитать в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
3-1325
corte ™
2003-08-07 10:01
2003.09.01
Всем привет. Есть ли что то на подобие BatchMove для ADO ??


14-1640
Best Guns
2003-08-12 20:06
2003.09.01
Сайт delphimaster не отвечал


14-1664
Andryk
2003-08-14 10:51
2003.09.01
Вопрос на засыпку :о))


6-1526
MSasha
2003-06-23 11:08
2003.09.01
Как написать FTP server используя Indy? Пример pls.


3-1288
Zorik
2003-08-11 10:31
2003.09.01
как удалить prymary key в Interbase