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

Вниз

Поиск в файле   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.056 c
1-1091711728
axelrod
2004-08-05 17:15
2004.08.22
Как преобразовать звуковой файл в числовую модель?


14-1091816077
Денисыч
2004-08-06 22:14
2004.08.22
Вопрос про легальность Delphi


3-1091290331
Klerk
2004-07-31 20:12
2004.08.22
Select c пробелом


4-1089285412
bar
2004-07-08 15:16
2004.08.22
Загрузка и выгрузка dll в чужой процесс


14-1091519680
DSKalugin
2004-08-03 11:54
2004.08.22
ВАКАНСИЯ!!!