Главная страница
    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.037 c
4-1089293896
DDDeN
2004-07-08 17:38
2004.08.22
Кол-во логических дисков в системе


1-1092026807
dimon_programmer
2004-08-09 08:46
2004.08.22
IF не работает


9-1083856438
Маг Гыр
2004-05-06 19:13
2004.08.22
Несколько вопросов по DirectX ?


14-1091696301
Sir John
2004-08-05 12:58
2004.08.22
Registry, xml, ini и другие товарищи


9-1083592113
Lockdog
2004-05-03 17:48
2004.08.22
Столкновение спрайтов





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