Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.045 c
4-1089558357
Фёдор Мегатронов
2004-07-11 19:05
2004.08.22
Есть ли функция возвращающая размер фаила в инете ?


3-1091199727
pashtet
2004-07-30 19:02
2004.08.22
Что лучше Interbase FB Yaffil или PostgreSQL Ingres?


14-1091638104
sasha_n
2004-08-04 20:48
2004.08.22
Структура файла SecEvent.Evt


14-1091605396
Alx2
2004-08-04 11:43
2004.08.22
Домохозяин. Или как угодить обывателю?


3-1091097877
Fynjy
2004-07-29 14:44
2004.08.22
Можно ли в DBGrid зафиксировать столбец?





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