Для получения и н ф о р м ац и и о с в о б о д н о м п р о с т р а н с тв е (в
байтах) н а диске след ует вы звать ф ункцию
D is k F r e e (D r iv e :
B y te ) : lo n g i n t
м одуля D O S . А н а л о ги ч н а я ситуация и с 2 Гб.
Д в е п о сл е д н и е ф ункции то ж е м огут в ы звать а в а р и й н о е з а -
в е р ш е н и е п р о гр а м м ы п ри в о зн и к н о в е н и и о ш и б к и , если не
вы пол нить д и р е кти ву { $ 1 - ) ; к р о м е то го, о н и н и как не влия-
ю т н а зн ач е н и е , в о з в р а щ а е м о е с и сте м н о й ф ун кци ей
iO R e -
s u l t , о к о т о р о й п о й д е т речь д ал ее. О д н а к о д а н н ы е ф унк-
ции в с л у ч а е о ш и б к и в о з в р а щ а ю т зн а ч е н и е - 1 , если у к а з а н -
ный диск отсутствует.
Е щ е м од ул ь D O S п р е д о с т а в л я е т н е ск о л ь к о п о л езн ы х п о д -
п р о г р а м м . ф у н к ц и я
F S e a r c h ( P a t h :P a t h S t r ; D i r L i s t :
s t r i n g ) :P a t h s t r
п р о и зв о д и т п о и ск ф а й л а с и м е н е м
Path
в
те кущ е й папке, и если ф айл н е найд ен , т о пои ск вы п ол н яет-
ся п о к а ж д о м у пути из с п и ск а
DirList,
где о н и п ер е чи сле н ы
ч е р е з то ч к у с зап ято й . П р и это м DirList м о ж е т б ы ть п усто й
стр о ко й . В сл у ч ае у д а ч н о го п о и ск а б у д е т в о з в р а щ е н а с т р о -
ка с и м ен ем и ск о м о го ф ай л а, и н ач е б у д е т в о з в р а щ е н а п ус-
та я стр о ка.
П о лучить полны й путь к ф айл у м ож н о, вы звав ф ункци ю
E x -
pa n d (P a t h :P a t h S t r ) :P a t h s t r ,
где
Path
— имя ф айла. Д а н -
ная ф ункция не п р о в е р я е т нали чие у к а з а н н о го ф а й л а н а д и с-
ке, а п р о с т о д о по л н я е т имя ф а й л а н е д о стаю щ и м и п а р а м е т -
р ам и — им енем те кущ е го д иска и путем к те кущ е м у каталогу.
П р о ц е д у р а
F S p l i t (P a t h :P a t h S t r ; v a r D i r : D i r S t r ; v a r
N a m e iN a m e S tr; v a r E x t : E x t s t r )
п о зв о л я е т р а зл о ж и ть п о л -
н о е имя ф а й л а
Path
н а с о с та в л я ю щ и е : путь к ф а й л у в
D i r ,
к о р о т к о е имя ф а й л а в
Name
и о к о н ч а н и е (р а сш и р е н и е ) и м е -
ни ф а й л а в
E x t.
П р и м е р ы с м о тр и те ниже.
Н е л ьзя не уп о м я н уть о двух о ч е н ь п о л е зн ы х п р о ц е д у р а х ,
к о т о р ы е п о зв о л я ю т стр о и ть ко н струкц и и п о и с к а ф а й л о в и п а -
п о к п о у к а з а н н о м у п ути и м аск е . П р о ц е д у р а
F i n d F i r s t
( P a t h : s t r i n g ; A t t r : w o r d ; v a r S : S e a rc h R e c )
п р о и з в о д и т
п о и ск п е р в о го ф а й л а или п ап ки п о у к а з а н н о м у пути
Path,
р е -
зул ьтат ж е п о и с к а з а н о с и т в п е р е м е н н у ю s ти п а
SearchRec,
к о то р ы й о п и с а н в м о д ул е D O S так:
ty p e
S e a rc h R e c = r e c o r d
F i l l : a r r a y [ 1 .
. 2 1 ] o f b y t e ;
A t t r : b y t e ;
Tim e : l o n g i n t ;
S iz e : l o n g i n t ;
Name : s t r i n g [ 1 2 ] ;
e n d ;
Д а н н а я стр уктур а не в ы д ум ан а р а з р а б о т ч и к а м и T u rb o P a s-
cal, а п р о д и к т о в а н а и н те р ф е й с о м с е р в и с а M S - D O S . И м е н а
п о л е й го в о р я т с а м и з а себя. Р а з в е ч то зн ач е н и я поля
A t t r
сле д ует р а с ш и ф р о в а ть . Д а н н о е п о л е х р а н и т п р и зн а к эл е м ен -
т а к а т а л о га — гр у б о гово р я, п о к азы в а е т, п а п к а это или ф айл.
П р о ц е д у р а
F in d N e x t (v a r S :S e a r c h R e c )
п р е д н а з н а ч е н а
для п о и ск а к а ж д о го п о с л е д у ю щ е го эл е м е н та к а та л о га ; п р е д -
вар и те л ьн о д о л ж н а бы ть в ы зв ан а п р о ц е д у р а
F i n d F ir s t .
П р о -
ц ед ур ы
F i n d F i r s t
и
F in d N e x t
м о д и ф и ц и р ую т зн а ч е н и е п е -
р е м е н н о й
D o s E r r o r ,
о б ъ яв л е н н о й в м о д ул е
D O S,
п о э то м у
п о сл е вы пол нени я л ю б о й из этих двух п р о ц е д у р сл е д ует п р о -
верять ее зн ач ен и е . Если зн а ч е н и е р а в н о нулю , зн ачит, п о -
иск п р о в е д е н у сп е ш н о , м о ж н о п р о д о л ж а т ь и скать д ал ее ; е с -
ли нет, н а с л и б о п о сти гл а н е уд ач а , л и б о уж е бы ли н айд ен ы
все элем енты , о т в е ч а ю щ и е кр и те р и я м Path. П р и э то м п а р а -
м е т р
P a th
м о ж е т бы ть л и б о пустой, и то гд а п о и ск б у д е т п р о -
водиться в те к ущ е й пап ке, л и б о м о ж е т с о д е р ж а ть путь п о и с -
к а и м а с к у п о и ска. О с н о в ы в а я с ь н а м н о го л е тн е й п ракти ке,
м о гу с к азать, ч то п а р а м е т р
A t t r
п р о ц е д у р о й
F i n d F i r s t
ни-
как н е учи ты вается, п о э то м у п о с л е о ч е р е д н о го п о и с к а сл е -
д уе т п р о в е р я ть а т р и б у т н а й д е н н о го э л е м ен та к а та л о га . В о т
п р и м е р п о и с к а ф а й л о в п о пути и м аске:
p ro c e d u re P r i n t F i l e L i s t ( P a th , M ask : s t r i n g ) ;
b e g in
F i n d F i r s t ( P a th + M a sk , A n y F i l e , Rec ) ;
w h ile D o s E r r o r = 0 do b e g in
i f Rec . A t t r = A r c h iv e th e n
w r i t e l n ( P a th , R e c.N a m e , ' ' , R e c .S iz e ) ;
F in d N e x t ( Rec ) ;
e n d ;
e n d ;
А э то п р и м е р п о и с к а папок:
p r o c e d u re P r i n t D i r L i s t ( P a t h , M ask : s t r i n g ) ;
b e g in
F i n d F i r s t ( P a th + M a sk , A n y F i l e , Rec ) ;
w h ile D o s E r r o r = 0 do b e g in
i f ( R e c . A t t r = D i r e c t o r y )
an d (R e c .Name <> '. ')
an d (R ec.N am e <> ' .
. ' ) th e n
w r i t e l n ( P a t h ,R e c .N a m e , '< D IR > ' ) ;
F in d N e x t ( Rec ) ;
e n d ;
e n d ;
при э то м о тсе к а е м ненуж ное. А след о м идет при м ер, п о к азы -
ваю щ ий , как и сп о л ьзо в а ть пре д ставл е н н ы е вы ш е процедуры :
u s e s D o s;
v a r Rec : S e a rc h R e c ;
b e g in
{ ищем в те кущ ей па п к е в се файлы , которы е н а ч и наю тся с
f i l e )
P r i n t F i l e L i s t ( " , ' f i l e * . * ' ) ;
r e a d ln ;
{ ищем п а п к и , вложенные в текущ ую п а п к у }
P r i n t D i r L i S t ( " , '*.*' ) ;
r e a d ln ;
{ ищем в се файлы в корневом к а т а л о г е д и с к а }
P r i n t F i l e L i s t ( 'd:\', '*.*' );
r e a d l n ;
{ ищем в се п а п к и в па п к е d:\install\)
P r i n t D i r L i S t ( ' d : \ i n s t a l l \ ' , '*.*' );
e n d .
В п р о ч е м , я н е м н о го увлекся р а с с м о т р е н и е м м од уля D O S ,
с о в с е м за б ы в о гл ав н о й с е го д н я ш н е й тем е.
Обработка ошибок ввода-вывода
П р и р а б о т е с ф а й л о в о й с и с те м о й м о гут во зн и к ать р а з н о -
го р о д а курьезы : т о ф айл не н ай д ен , т о к ф а й л у н е т д о с т у -
па, т о и с ч е р п а н о м е с т о н а диске, т о д и ск е та (м агнитны й н а -
копитель) за щ и щ е н а , т о п о го д а н е л е тн а я © .
В и то ге с та р а н и я м и систем ы н а ш а п р о г р а м м а м о ж е т бы ть
п р е р в а н а в сам ы й н е по д хо д ящ и й м ом ент. К ак говорится, то ль-
ко ж ениться со бр ался.
.. п а р д о н , с о х р а н и т ь за в е тн ы е д а н н ы е
н а диск, а та м глядиш ь — с в о б о д н ы е м е с т а все выш ли.
Ч то б ы взять б ы к а з а р о г а (в д а н н о м сл у ч ае — п о зв о л и ть
о б р а б о т а т ь а в а р и й н у ю с и т у а ц и ю с а м о й п р о гр ам м е ), следу-
ет п е р е д ф р а гм е н т о м к о д а с д и сковы м и о п е р а ц и я м и у с т а н о -
вить д и р е к ти в у ( $
1
- > — то гд а п р о г р а м м а н е б у д е т з а в е р ш е -
н а а в а р и й н о , з а т о м о ж н о б у д е т п о л уч и ть к о д в о зн и к ш е й
о ш и б к и п о с р е д с тв о м в ы зо в а ф ункции
iO R e s u lt
(о — о ш и б -
ки нет). С л е д у е т п р о и зв о д и ть п р о в е р к у в о з в р а щ а е м о г о з н а -
чения д а н н о й ф ункции п о с л е каж д о й д и с к о в о й о п е р а ц и и , ко-
т о р а я м о ж е т в ы звать о ш и б к у. Если ф ункция IO R e su lt не б ы -
л а в ы з в а н а с р а з у п о сл е о ш и б к и , д а л ьн е й ш и е д и ск о в ы е о п е -
р а ц и и б у д у т за б л о к и р о в а н ы и п р о и гн о р и р о в а н ы . П р и этом
д а н н а я ф ункция в о з в р а щ а е т код о ш и б к и то л ь к о р а з, а з а -
те м о б н у л я е т э то т код — те п е р ь п о с л е д у ю щ и е вы зовы этой
ф ункции б уд ут д а в а т ь н ул е в о й р е зу л ь та т д о тех п о р , п о к а к а -
кая-н иб уд ь о ш и б к а не п р о и зо й д е т с н о в а .
Р а с с м о т р и м н а п ри м ер е:
v a r Res : w o rd ;
S : s t r i n g ;
b e g in
A s s ig n ( F ile W o r d , 'w o r d s .d a t ' ) ; { $ 1 - }
R e s e t ( F ile W o rd ) ; {$ !+ >
Res := I O R e s u lt ;
I f R e s o O th e n b e g in
c a se Res o f
2 : S := ' F i l e n o t f o u n d ';
3 : S : = 'P a t h n o t f o u n d ';
5 : S := 'A c c e s s d e n i e d ';
6 : S := ' I n v a l i d h a n d le ' ;
10 : S := 'I n v a l i d e n v ir o n m e n t ';
11 : S := ' I n v a l i d f o r m a t ';
15 : S := ' I n v a l i d d r i v e ' ;
18 : S := 'N o m ore f i l e s ' ;
предыдущая страница 45 Мой Компьютер 2004 52 читать онлайн следующая страница 47 Мой Компьютер 2004 52 читать онлайн Домой Выключить/включить текст