Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизПоиск в файле Найти похожие ветки
← →
sdw_syscoder (2004-08-06 21:18) [0]Как можно реализовать считывание блоков из файла в TMemoryStream начиная, допустим, c символа "3A" и заканчивая "4646".
← →
ghg © (2004-08-06 21:25) [1]3А это что
адрес?
PChar?
← →
sdw_syscoder (2004-08-06 21:32) [2]> hg © (06.08.04 21:25) [1]
Да нет, обычный неструктурированный файл, который содержит последовательный набор символов.
← →
ghg © (2004-08-06 21:38) [3]насколько я знаю при считывании можно позиционироваться только по адресу (по номеру байта), а тчто в этом байте узнаешь только после того как позиционируешься и считаешь, так что имно нельзя
но может и не прав
← →
Fay © (2004-08-06 21:52) [4]2 ghg © (06.08.04 21:38) [3]
1) Ужасы какие. Я даже не понял, о чём речь, но очень страшно.
2) Нет такого слова - "имно".
2 sdw_syscoder (06.08.04 21:32) [2]
Вам знакомо слово CreateFileMapping?
← →
sdw_syscoder (2004-08-06 22:00) [5]> Fay © (06.08.04 21:52) [4]
> Вам знакомо слово CreateFileMapping?
Да че-та мельком слышал здесь, а какие он даёт преимущества и можно обойтись ли без него.
← →
Fay © (2004-08-06 22:07) [6]Преимущества :
1) Невдолбенная скорость.
2) Очень удобно, т.к. работаешь так же, как с памятью.
Если ты всёрьёз решил, во что бы то ни стало, "обойтись" -делай сам. 8)
← →
sdw_syscoder (2004-08-06 22:40) [7]Ну и как же посредством File Mapping найти в файле (как я понял, отображённым в памяти) блок по двум флагам (начало и конец), а затем его прочесть в переменную string.
← →
Fay © (2004-08-06 22:52) [8]Примерно так.
procedure TForm1.Button2Click(Sender : TObject);
var
f, m, sz : DWORD;
v, p1, p2, pe : PChar;
s : string;
begin
f := CreateFile("c:\File.any", GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if f = INVALID_HANDLE_VALUE then RaiseLastOSError;
s := "";
m := 0;
v := nil;
try
sz := GetFileSize(f, nil);
if sz = INVALID_FILE_SIZE then RaiseLastOSError;
if sz < 1 then Exit;
m := CreateFileMapping(f, nil, PAGE_READONLY, 0, 0, nil);
if m = 0 then RaiseLastOSError;
v := MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0);
if v = nil then RaiseLastOSError;
pe := v + sz - 1;
p1 := v;
while (p1 < pe) and (p1^ <> "1") do
Inc(p1);
if p1 = pe then Exit;
p2 := p1;
while p2 < pe do
begin
Inc(p2);
if p2^ = "2" then if p2[1] = "2" then
Break;
end;
if p2 = pe then Exit;
SetString(s, p1+1, p2-p1-1);
finally
if v <> nil then UnmapViewOfFile(v);
if m <> 0 then CloseHandle(m);
CloseHandle(f);
end;
ShowMessage(s);
end;
← →
Fay © (2004-08-06 22:55) [9]Это между "1" и "22", если кто не понял 8)
← →
Fay © (2004-08-06 23:00) [10]Ёжик задумался....
← →
sdw_syscoder (2004-08-06 23:05) [11]> Fay © (06.08.04 23:00) [10]
> Ёжик задумался....
У ёжика интернет ведь не бесплатный, а тем более и DialUp.
А вооще-то есть над чем подумать....я ушёл в себя....Wait please.
← →
sdw_syscoder (2004-08-06 23:14) [12]НИ ФИГА СЕБЕ, СКАЗАЛ Я СЕБЕ!
Ну ты блин и загнул. Это где же задаётся "22".
← →
Fay © (2004-08-06 23:16) [13]Не понял вопрос, но попробую ответить.
Я тестировал на файле такого содержания
0000000000000000000100000000000000000000000002200000000000000000
← →
Мастер © (2004-08-06 23:18) [14]А чем тебя не устраивает TFileStream?
Читаешь файл в буфер, ищешь начало нужного куска.
Если нашел, начинаешь копировать с этой позиции в TMemoryStream, одновременно проверяя на окончание куска.
← →
Fay © (2004-08-06 23:21) [15]Не думал, что DialUp бывает такой медленный.
← →
sdw_syscoder (2004-08-06 23:26) [16]> Fay © (06.08.04 22:52) [8]
Огромное спасибочки, FAY, работает!!! Попробую под себя заточить и в цикле дёргать строки между этими флагами, пока файл не закончиться.
> Мастер © (06.08.04 23:18) [14]
Во-Во! TFileStream мене больше подходит! Просто везде предлагают через FileMapping.
А можно, если Вас не затруднит, подогнать примерчик.
Заранее благодарен.
← →
Fay © (2004-08-06 23:27) [17]Ваще-то у меня есть ошибка в условии 2-го where. Исправь сам - я домой, так что меня час не будет.
← →
Fay © (2004-08-06 23:28) [18]2 sdw_syscoder (06.08.04 23:26) [16]
Получишь пример с TFileStream - сравни скорость.
← →
sdw_syscoder (2004-08-06 23:29) [19]> Fay © (06.08.04 23:21) [15]
Да вот, ёперный театр!, на карточке осталось 10 деревянных, поэтому и с опозданиями на connect выхожу.
← →
sdw_syscoder (2004-08-06 23:32) [20]> Fay © (06.08.04 23:28) [18]
Speed она скоростью, а ресурсов жрать ещё неизвестно что больше будет. А так OK! Сравню и доложу!
← →
Fay © (2004-08-07 00:38) [21]OK
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c