Мысли
в
Паскале
Владислав ДЕМЬЯНИШИН
Продолжение, начало см. в МК, Ne46, 51-52, 4, 6 -7 , 10, 12-13, 16-18, 22, 24, 29, 34, 41, 46, 4, 6, 17, 21, 23, 28, 30,
32, 39, 42, 45, 47, 52, 2, 7, 18-19, 23, 37, 39 (165, 170-171, 175, 177-178, 181, 183-184, 187-189, 193, 195, 200, 205,
212, 217, 227, 229, 240, 244, 246, 251, 253, 255, 262, 265, 268, 270, 275, 277, 282, 293-294, 298, 312, 314)
Н
емного мудреней получился метод позиционирования
r S e e k ,
который должен устанавливать указатель вложенного файла
на заданную позицию
P o s .
Н о перед этим он выполняет
проверку: если заданная позиция представляет собой
отрицательное число, то позиционирование осуществляется на
начало вложения. Если же заданная позиция превышает розмер
вложения, позиционирование назначоется на конец вложения.
Тут нужно быть аккуратным, так как последующее чтение данных
из вложения может позволить прочесть заголовок следующего
вложения, либо вызвать ошибку чтения зо пределами X M S -буфера.
p r o c e d u r e T R e s o u r c e . r S e e k ( v a r f ; P o s : l o n g i n t ) ;
v a r a f : T F i l e a b s o l u t e f ;
b e g i n
i f P o s < 0 t h e n P o s : = 0 ;
i f P o s > a f . F S i z e t h e n P o s : = a f . F S i z e ;
a f . F P o s : = P o s ;
e n d ;
f u n c t i o n T R e s o u r c e . r F i l e S i z e ( v a r f ) : l o n g i n t ;
v a r a f : T F i l e a b s o l u t e f ;
b e g i n
r F i l e S i z e : = a f . F S i z e ;
e n d ;
Теперь переходим к методу
r B l o c k r e a d ,
который выполняет
чтение данных из вложенного файла незовисимо оттого, загружен
ресурсный файл в X M S -память или остался нежиться но
отполированной поверхности жесткого диска.
В зависимости от размещения ресурсного файла может быть
выполнена вложенная процедура
r B l o c k R e a d X M S ,
которая
копирует
A C o u n t
бай т из X M S -буф ера ночиная с начала
размещения ресурсного файла
F R e s O f s ,
плюс смещение читаемого
вложения
a f . F O f s
в нем и плюс заданная позиция
a f .F P o s . Д
л я
чтения с диска будет выполнена процедура
r B l o c k R e a d D i s k ,
котороя составлена настолько традиционным для моих статей
образом, что в пояснении нуждается лишь строка
S e e k ( b f , F R e -
s O f s + a f
.
F O f s
+
a f
.
F P o s
). Данная операция, несмотря на такое
длинное арифметическое выражение, выполняет позиционирование
указателя ресурсного файла на начало читоемого вложения
a f . F O f s ,
плюс его текущая позиция
a f . f p o s .
П ри этом значение
F R e s O f s
ещ е при создании экземпляре объекта для режима
загрузки
F R e s T y p e = r t D i s k
получило нулевое значение, и указано
лишь для визуального сходство обоих вложенных процедур, хотя
исходя из соображений оптимизации можно было фрагмент
F R e -
s O f s +
из данного выражения убрать.
В о б е и х п р о ц е д у р а х з н а ч е н и е п о л я f p o s ф а й л о в о й п е р е м е н н о й
у в е л и ч и в а е т с я н а р а з м е р п р о ч и т а н н ы х д а н н ы х ,
p r o c e d u r e T R e s o u r c e . r B l o c k r e a d ( v a r f , D o s B u f ; A C o u n t :
w o r d ; v a r R e s u l t : w o r d ) ;
v a r a f : T F i l e a b s o l u t e f ;
{ ч т е н и е и з р е с у р с н о г о ф а й л а , з а г р у ж е н н о г о в JIM S }
p r o c e d u r e r B l o c k R e a d X M S ;
b e g i n
m o v e X M S T o M e m ( F R e s B u f , D o s B u f ,
F R e s O f s + a f . F O f s + a f . F P O S , A C o u n t ) ;
R e s u l t : = A C o u n t ;
a f . F P o s : = a f . F P o s + A C o u n t ;
e n d ;
{ ч т е н и е и з р е с у р с н о г о ф а й л а н а д и с к е }
p r o c e d u r e r B l o c k R e a d D i s k ;
v a r b f : f i l e ;
b e g i n
A s s i g n ( b f , F N a m e ) ; { $ 1 - }
R e s e t ( b f , 1 ) ; { $ 1 + }
F I o R e s u l t : = I O r e s u l t ;
i f F I o R e s u l t < > 0 t h e n e x i t ;
S e e k ( b f , F R e s O f s + a f . F O f s + a f . f p o s ) ;
b l o c k r e a d ( b f , D o s B u f , A C o u n t , R e s u l t ) ;
a f . F P o s : = a f . f p o s + R e s u l t ;
C l o s e ( b f ) ;
e n d ;
b e g i n
i f F R e s T y p e = r t X M S t h e n r B l o c k R e a d X M S
e l s e r B l o c k R e a d D i s k ;
e n d ;
Заверш аю щ ий метод прост до смешного ©.Ив самом деле,
что ном закрывать, если мы ничего не открывали?
p r o c e d u r e T R e s o u r c e . r C l o s e ( v a r f ) ;
b e g i n
e n d ;
С объектом для ресурсных файлов мы разобрались. О сталось
рассмотреть подпрограмму, которая добавляла бы файл с именем
A d d F i l e N a m e
в создаваемый или уже существующий ресурсный
файл
R e s F i l e N a m e .
Э то будет функция, возвращ аю щ ая нулевое
значение при успеш но выполненной работе, иначе лю бое другое
значение будет означать код ошибки.
В рассматриваемом блоке все должно быть вам настолько
знакомо, что мне лучше объяснить его лишь вкратце. Во-первых,
следует проверить наличие необходимого объема свободной памяти
для буфера копирования, иначе и не стоит затевать всю эту кутерьму.
Во-вторых, пытаемся открыть файл, претендующий на почетный
титул вложения. Если все проходит гладко, пытаемся открыть еще
и ресурсный файл. Если он к этому времени уже существует, то
позиционируем его указатель в конец, чтобы затем добавить
очередной заголовок и файл, о если ресурсного файла нет, то
создаем его. Затем следует выделение памяти под временный буфер
B u f
для копирования. После этого определяем размер вкладывоемого
файла и заполняем переменную
R e c
данными о нем — заголовок
готов. Далее следует запись заголовка и содержимого добавляемого
файла в ресурсный файл. Освобождаем память,
f u n c t i o n A d d F i l e T o R e s o u r c e ( R e s F i l e N a m e ,
A d d F i l e N a m e : s t r i n g ) : w o r d ;
c o n s t a r s i z e = S i z e O f ( T A r r B y t e ) ;
v a r r f , a f : f i l e ;
e r r , d , c o u n t : w o r d ;
l o n g : l o n g i n t ;
R e c : T R e s F i l e R e c ;
b u f : “ T A r r B y t e ;
b e g i n
A d d F i l e T o R e s o u r c e : = 0 ;
i f M a x A v a i l < a r s i z e t h e n b e g i n
A d d F i l e T o R e s o u r c e : = 2 0 3 ;
e x i t ;
e n d ;
A s s i g n f
a f , A d d F i l e N a m e ) ; { $ 1 - }
R e s e t ( a f , 1 ) ; { $ ! - }
e r r : = I O r e s u l t ;
i f e r r < > 0 t h e n b e g i n
A d d F i l e T o R e s o u r c e : = e r r ;
e x i t ;
e n d ;
A s s i g n ( r f , R e s F i l e N a m e ) ; { $ 1 - }
R e s e t ( r f , 1 ) ; { $ 1 + }
М О Й К О М П Ь Ю Т Е Р
предыдущая страница 37 Мой Компьютер 2004 45 читать онлайн следующая страница 39 Мой Компьютер 2004 45 читать онлайн Домой Выключить/включить текст