OMMAND.COM, kotoryj nesomnenno yavlyaetsya osnovnoj chast'yu opera- cionnoj sistemy. Fiksirovannye diski imeyut glavnuyu zapis' zagruzki, kotoraya soderzhit tablicu razdelov, pozvolyayushchuyu razdelit' disk mezhdu nes- kol'kimi operacionnymi sistemami. Tablica razdelov soderzhit in- formaciyu o tom, gde na diske nachinaetsya razdel DOS, a takzhe per- vyj sektor kakogo razdela soderzhit zapis' nachal'noj zagruzki. V ostal'nom razdel organizovan tak zhe, kak i disketa. 5.1.1 CHtenie tablicy razmeshcheniya fajlov. Disk ispol'zuet tablicu razmeshcheniya fajlov (FAT) dlya otvedeniya diskovogo prostranstva fajlam i hraneniya informacii o svobodnyh sektorah. Iz soobrazhenij bezopasnosti na vseh diskah hranyatsya dve kopii FAT. Oni hranyatsya posledovatel'no, v sektorah s samymi mladshimi dostupnymi logicheskimi nomerami, nachinaya so storony 0, dorozhki 0, sektora 2 (sektor 1 takzhe zanyat zapis'yu nachal'noj zagruzki). CHislo sektorov, zanimaemyh FAT opredelyaetsya razmerom i tipom diska. Otmetim, chto v MS DOS 3.0 razmer zapisi FAT mozhet byt' 16 bitov dlya fiksirovannogo diska. Zdes' my budem rassmatri- vat' tol'ko 12-bitnye zapisi; dlya polucheniya informacii o 16-bito- vyh zapisyah, smotrite Tehnicheskoe rukovodstvo po MS DOS. Tablica razmeshcheniya fajlov hranit informaciyu o kazhdom klastere sektorov na diske. Klaster eto gruppa standartnyh sektorov razme- rom 512 bajt (nezavisimo ot tipa diska MS DOS vsegda rabotaet s 512-bajtnymi sektorami). Gruppa sektorov ispol'zuetsya, chtoby umen'shit' razmer FAT. Odnako bol'shie klastery, ispol'zuemye na fiksirovannom diske naprasno rashoduyut diskovoe prostranstvo pri zapisi malen'kih fajlov (utilita razmerom 500 bajt beret 4K dis- kovogo prostranstva). Imeetsya nabor razmerov klasterov i razmerov FAT, ispol'zuemyh v IBM PC: Tip diska Sektorov na klaster Razmer FAT disketa 160K 1 1 disketa 180K 1 1 disketa 320K 2 2 disketa 360K 2 2 disketa 1.2M 1 7 vinchester 10M 8 8 vinchester 20M 4 40 Pri bol'shem razmere klastera naprasno rashoduetsya diskovoe prostranstvo, no kogda bol'shie diski imeyut malyj razmer klastera, to tablica razmeshcheniya fajlov stanovitsya slishkom bol'shoj. Pri rabote s diskami DOS zagruzhaet kopiyu FAT v pamyat', po vozmozhnosti sohranyaya ee tam, poetomu pri bol'shom razmere FAT mozhet rashodo- vat'sya mnogo operativnoj pamyati. Poskol'ku bol'shinstvo AT imeyut dostatochno mnogo pamyati, to dlya nih priemlemy namnogo bol'shie FAT. Poetomu dlya 20M vinchestera vzyaty men'shie razmery klasterov, chem dlya 10M, obespechivaya ekonomiyu diskovogo prostranstva. Dlya disket emkost'yu 1.2M vybran klaster razmerom v 1 sektor, tak kak ih osnovnoe naznachenie sostoit v hranenii kopij zhestkogo diska, a sledovatel'no kompaktnost' ochen' vazhna. Kazhdaya poziciya v tablice razmeshcheniya fajlov sootvetstvuet opre- delennoj pozicii klastera na diske. Obychno fajl zanimaet neskol'- ko klasterov i zapis' v kataloge fajlov soderzhit nomer startovogo klastera, v kotorom zapisano nachalo fajla. Prosmotrev poziciyu FAT, sootvetstvuyushchuyu pervomu klasteru, DOS nahodit nomer klaste- ra, v kotorom hranitsya sleduyushchaya porciya etogo fajla. |tomu klas- teru sootvetstvuet svoya zapis' v FAT, kotoraya v svoyu ochered' soderzhit nomer sleduyushchego klastera v cepochke. Dlya poslednego klastera, zanyatogo fajlom FAT soderzhit znacheniya ot FF8H do FFFH. Neispol'zuemym (ili osvobozhdennym) klasteram zapisyvaetsya znache- nie 000, a plohim sektoram - FF7H. Nakonec, znacheniya ot FF0H do FF7H pripisyvayutsya rezervnym klasteram. Nomer klastera soderzhit 3 shestnadcatirichnye cifry, dlya hrane- niya kotoryh trebuetsya 1 1/2 bajta. Dlya umen'sheniya razmerov FAT chisla dlya dvuh sosednih klasterov hranyatsya v treh posledovatel'- nyh bajtah tablicy. MS DOS avtomaticheski proizvodit vse neobhodi- mye vychisleniya. Pervye tri bajta FAT ne ispol'zuyutsya dlya nomerov klasterov. Pervyj bajt soderzhit kod, opredelyayushchij tip diska (sm. [1.1.5]), a sleduyushchie 2 bajta oba ravny FFH. Poskol'ku eti pozicii tablicy zanyaty, to klastery numeruyutsya, nachinaya s 2, prichem klastery 2 i 3 zanimayut vtoruyu trojku bajt tablicy. MS DOS 3.0 mozhet sozdavat' FAT s zapisyami razmerom 16 bit. Takie zapisi neobhodimy dlya fiksirovannyh diskov razmerom bolee 10M, kotorye imeyut bol'she, chem 4086 klasterov. Na ris. 5-1 poka- zana svyaz' mezhdu FAT i klasterami na diske. Ochen' redko imeyutsya prichiny vnosit' izmeneniya pryamo v tablicu razmeshcheniya fajlov. MS DOS zabotitsya obo vseh fajlovyh operaciyah i obespechivaet procedury, analiziruyushchie tablicu na predmet nalichiya svobodnogo prostranstva na diske. Odnako dlya nekotoryh special'- nyh celej, takih kak vosstanovlenie udalennyh fajlov ili napisa- nie drajvera blochnogo ustrojstva, neobhodim pryamoj dostup k FAT. Pri pryamom dostupe k FAT nado soblyudat' sleduyushchie pravila. Dlya nahozhdeniya sleduyushchego klastera fajla: 1. Umnozh'te nomer klastera na 1.5. 2. Prochitajte 2 bajta s poluchennym smeshcheniem (okgruglyaya vniz). 3. Esli nomer klastera chetnyj, to voz'mite mladshie 12 bit, inache voz'mite starshie 12 bit. Dlya preobrazovaniya nomera klastera v logicheskij nomer sektora: 1. Vychtite 2 iz nomera klastera. 2. Umnozh'te rezul'tat na chislo sektorov v klastere. Vysokij uroven'. V dannom primere chitaetsya FAT i poredelyaetsya znachenie, hranya- shcheesya dlya klastera nomer 6. V [5.4.2] ob®yasnyaetsya nachal'nyj kod, chitayushchij sektora FAT. Rezul'tatom yavlyaetsya 12-bitnoe chislo, predstavlennoe v vide treh shestnadcatirichnyh cifr (4 bita kazh- daya), vozvrashchaemoe v vide stroki. V primere pary chisel, sostoyashchih iz dvuh cifr, ob®edineny i v kachestve rezul'tata berutsya pravye ili levye tri cifry. Kogda Bejsik preobrazuet simvol v 16-nuyu formu, to on vozvrashchaet tol'ko odnu cifru, esli pervaya byla nu- lem, poetomu udalennyj nol' dolzhen byt' vosstanovlen, chtoby etot metod rabotal pravil'no. 100 '''chtenie sektorov FAT 110 DEFINT A-Z 120 DATA &H55, &H8B, &HEC, &H1E, &H8B, &H76, &H0C, &H8B 130 DATA &H04, &H8B, &H76, &H0A, &H8B, &H14, &H8B, &H76 140 DATA &H08, &H8B, &H0C, &H8B, &H76, &H06, &H8A, &H1C 150 DATA &H8E, &HD8, &H8B, &HC3, &HBB, &H00, &H00, &HCD 160 DATA &H25, &H59, &H1F, &H5D, &HCA, &H08, &H00 170 DEF SEG = &H1000 'pomeshchaem mashinnyj kod s etogo adresa 180 FOR N = 0 TO 38 'chitaem 39 bajtov dannyh 190 READ Q: POKE N,Q 'perenosim ih v pamyat' 200 NEXT ' 210 READSECTOR = 0 'nachinaem proceduru s 1-go bajta 220 BUFFER = &H2000 'adres bufera priema dannyh 230 LOGICALNUMBER = 1 'nachal'nye sektora FAT 240 NUMBERSECTORS = 2 '2 sektora v FAT 250 DRIVE = 0 'chitaem nakopitel' A 260 CALL READSECTOR(BUFFER,LOGICALNUMBER,NUMBERSECTORS,DRIVE) 270 '''opredelyaem nomer sleduyushchego klastera fajla 280 DEF SEG = &H2000 'bufer, gde hranitsya FAT 290 CLUSTERNUMBER! = 6 'klaster nomer 6 300 C! = CLUSTERNUMBER! 'delaem kopiyu 310 C! = INT (C!*1.5) 'umnozhaem na 1.5 i okruglyaem 320 X = PEEK(C!) 'chitaem 2 bajta s etoj pozicii 330 Y = PEEK(C!+1) ' 340 X$ = HEX$(X): Y$ = HEX$(Y) 'perevodim v 16-nye stroki 350 IF LEN(X$) = 1 THEN X$ = "0"+X$ 'delaem iz 2-simvol'nymi 360 IF LEN(Y$) = 1 THEN Y$ = "0"+Y$ ' 370 H$ = Y$ + X$ 'ob®edinyaem chisla v odnu stroku 380 '''proveryaem klaster na chetnost' 390 IF CLUSTERNUMBER! MOD 2 <> 0 THEN 420 'uhod, esli nechetnyj 400 NEXTCLUSTER$ = RIGHT$(H$,3) 'esli chetnyj, to pravye 3 cifry 410 GOTO 430 420 NEXTCLUSYER$ = LEFT$(H$,3) 'esli nechetnyj, to levye 430 PRINT NEXTCLUSTER$ 'pechataem rezul'tat Srednij uroven'. Funkciya DOS 1CH daet informaciyu o tablice razmeshcheniya fajlov, no ne daet samu FAT. Pomestite nomer nakopitelya v DL, gde 0 = nakopitel' po umolchaniyu, 1 = A, i t.d. Pri vozvrate DX soderzhit chislo klasterov v FAT, a CX - chislo bajtov v sektore. DS:BX uka- zyvaet na bajt, soderzhashchij pervyj bajt FAT, t.e. na kod, ukazy- vayushchij tip diska; eti kody perechisleny v [1.1.5]. Nizkij uroven'. Namnogo legche poluchit' dostup k FAT v yazyke assemblera. Otme- tim, chto umnozhenie nomera klastera na 1.5 proizvoditsya kopirova- niem chisla, sdvigom kopii vpravo na 1 bit dlya deleniya popolam i slozheniem kopii s originalom. |tot metod avtomaticheski okgrulyaet rezul'tat vniz. Kod, schityvayushchij sektora FAT v pamyat', obsuzhdaet- sya v [5.4.2]. ;---v segmente dannyh BUFFER DB 1024 DUP(0) ;otvodim mesto dlya 2 sektorov ;---chitaem FAT v pamyat' LEA BX,BUFFER ;ukazyvaem na bufer dannyh MOV DX,1 ;logicheskij nomer sektora MOV CX,2 ;2 sektora MOV AL,0 ;nakopitel' A INT 25H ;chitaem sektora POP CX ;vosstanavlivaem stek ;---poluchaem nomer klastera MOV AX,3 ;nomer klastera v AX MOV CX,AX ;delaem kopiyu MOV DX,AX ;delaem vtoruyu kopiyu SHR DX,1 ;delim vtoruyu kopiyu na 2 ADD CX,DX ;skladyvaem mezhdu soboj ADD BX,CX ;dobavlyaem kak smeshchenie MOV DX,[BX] ;poluchaem 2 bajta iz etogo mesta TEST AX,1 ;nomer klastera nechetnyj? JNZ ODD_CLUSTER ;uhod, esli da AND DX,0000111111111111B ;poluchaem nomer JMP SHORT CONTINUE ;uhod cherez obrabotku nechetnogo ODD_CLUSTER: MOV CL,4 ;podgotovka k sdvigu vpravo SHR DX,CL ;sdvigaem vniz starshie 12 bitov CONTINUE: 5.1.2 Opredelenie dostupnogo diskovogo prostranstva. Hotya v sleduyushchem podrazdele ob®yaneno kak vosstanovit' situaci- ciyu pri oshibke iz-za nehvatki mesta na diske, no net luchshego lekarstva, chem predusmotritel'nost'. Programma dolzhna kontroliro- vat' dostupnoe diskovoe prostranstvo i soobshchat' pol'zovatelya o nehvatke mesta. Esli mesta ne hvataet, to pol'zovatel' mozhet vyjti iz programmy i ustranit' problemu bez poteri informacii. Vysokij uroven'. Sleduyushchaya assemblernaya podprogramma vozvrashchaet v peremennuyu CLUSTERS chislo svobodnyh klasterov na ukazannom diske. Nado po- mestit' nomer nakopitelya v DRIVENUM, gde 1 = A, 2 = B i t.d. V prilozhenii G ob®yasnyaetsya kak assemblernye podprogrammy vklyuchayutsya v programmy na Bejsike. 10 DEFINT A-Z 'ispol'zuem celye peremennye 20 DRIVENUM = 1 'syuda pomeshchaem nomer nakopitelya 30 CLUSTERS = 0 'inicializiruem peremennuyu 40 DATA &H55, &H8B, &HEC, &H8B, &H76, &H06, &H8B 50 DATA &H14, &HB4, &H36, &HCD, &H21, &H8B, &H7E 60 DATA &H08, &H89, &H1D, &H5D, &HCA, &H04, &H00 70 DEF SEG = &H1000 'pomeshchaem podprogrammu 80 FOR N = 0 TO 20 'berem kazhdyj bajt 90 READ Q: POKE N,Q 'chitaem ego i pomeshchaem v pamyat' 100 NEXT ' 110 FREESPACE = 0 'ukazatel' na nachalo procedury 120 CALL FREESPACE(CLUSTERS,DRIVENUM) 'vyzov procedury 130 PRINT "CLUSTERS: ";CLUSTERS 'pechat' chisla klasterov Srednij uroven'. Funkciya 36H preryvaniya 21H soobshchaet skol'ko imeetsya svobodnogo prostranstva na diske. Edinstvennyj vhodnoj registr DL, kotoryj dolzhen soderzhat' nomer nakopitelya. Nakopitel' po umolchaniyu oboz- nachaetsya 0, nakopitel' A - 1 i t.d. Pri vozvrate BX soderzhit chislo dostupnyh klasterov, AX - chislo sektorov v klastere, a CX - kolichestvo bajt v sektore. Nebol'shoe uprazhnenie v umnozhenii daet zhelaemyj rezul'tat. V sleduyushchem primere proveryaetsya, chto na dvuhstoronnej diskete ostalos' po men'shej mere 2K diskovogo prostranstva: MOV AH,36H ;nomer funkcii MOV DL,1 ;nakopitel' A INT 21H ;poluchaem informaciyu CMP BX,2 ;imeetsya li 2 svobodnyh klastera? JL RUNNING_OUT ;esli net, to soobshchaem ob etom 5.1.3 Poluchenie/ustanovka razmera fajla. Programma mozhet pozhelat' proverit' razmer fajla po raznym prichinam. Odna iz vozmozhnyh prichin sostoit v opredelenii chisla zapisej, soderzhashchihsya v fajle. Drugaya - v opredelenii pozicii konca fajla, s tem chtoby fajlovyj ukazatel' byl ustanovlen verno dlya dobavleniya v fajl novyh dannyh, bez izmeneniya sushchestvuyushchih. Konechno, razmer fajla ustanavlivaetsya avtomaticheski funkciej DOS. Inogda programma mozhet nuzhdat'sya v rezervirovanii diskovogo prostranstva dlya dal'nejshego ispol'zovaniya. V etom sluchae nado otkryt' fajl v rezhime pryamogo dostupa i zapisat' takoj nomer zapisi, chtoby fajl imel dostatochnuyu dlinu. Zapisi mezhdu "fiktiv- noj" i real'no otnosyashchimisya k fajlu budut zapolneny temi dannymi, kotorye sluchajno okazhutsya v diskovyh sektorah, otvedennyh dlya fajla pri etoj operacii. Vysokij uroven'. V Bejsike funkciya LOF (dlina fajla) vozvrashchaet tochnoe chislo bajtov, otvedennyh fajlu (preduprezhdaem, odnako, chto starye ver- sii Bejsika - 1.h - vozvrashchayut chislo 128-bajtnyh blokov, ispol'- zuemyh fajlom). Fajl dolzhen byt' otkryt i ssylat'sya na nego nado po nomeru, pod kotorym byl otkryt fajl. Format X = LOF(1). V sleduyushchem primere opredelyaetsya skol'ko 64-bajtnyh zapisej soder- zhitsya v fajle, otkrytom kak #3: 100 OPEN "FILENAME" AS #3 'otkryvaem fajl 110 RECORDLEN = 64 'opredelyaem dlinu zapisi 120 NUMBREC = LOF(3)/RECORDLEN 'vychislyaem chislo zapisej Srednij uroven'. FCB funkciya 23H preryvaniya 21H soobshchaet chislo zapisej v fajle. Esli pripisat' fajlu dlinu zapisi v 1 bajt, to ego razmer budet vozvrashchen v bajtah. DS:DX dolzhny ukazyvat' na upravlyayushchij blok otkrytogo fajla. Zatem vyzovite funkciyu. Esli fajl ne najden, to v AL vozvrashchaetsya FF. V protivnom sluchae v AL vozvrashchaetsya 0, a chislo zapisej pomeshchaetsya v pole nomera zapisi pryamogo dostupa FCB (bajty 33-36). Dlya pravil'noj raboty pole dliny zapisi FCB dolzhno byt' ustanovleno posle otkrytiya fajla, no pered vyzovom funkcii; eto dvuhbajtnoe pole raspolozheno po smeshcheniyu 14 v FCB. Esli raz- mer fajla netochno delitsya na dlinu zapisi, to soobshchaemoe chislo zapisej okruglyaetsya vverh. Vot primer, v kotorom ispol'zuetsya dlina zapisi ravnaya 1: ;---opredelenie razmera fajla LEA DX,FCB ;DS:DX ukazyvaet na FCB MOV BX,DX ;kopiruem ukazatel' v BX MOV CX,1 ;razmer zapisi v CX MOV [BX]+14,CX ;pishem v pole razmera zapisi FCB MOV AH,23H ;funkciya soobshchayushchaya razmer fajla INT 21H ;vyzov funkcii MOV AX,[BX]+33 ;poluchaem mladshuyu chast' razmera fajla MOV CX,[BX]+35 ;poluchaem starshuyu chast' razmera fajla Mozhno takzhe ustanavlivat' dlinu fajla, ispol'zuya upravlyayushchie bloki fajla. Dlya etogo nado ispol'zovat' funkciyu zapisi bloka s pryamym dostupom, kotoraya obsuzhdaetsya v [5.4.5]. U etoj funkcii imeetsya chastnyj sluchaj, kogda chislo zapisannyh zapisej ustanavli- vaetsya ravnym nulyu, to dlina fajla ustanavlivaetsya ravnoj chislu zapisej, ukazannomu v pole zapisi pryamogo dostupa. Metod, ispol'zuyushchij deskriptor fajla (file handle) ne imeet funkcii, kotoraya neposredstvenno soobshchala by dlinu fajla, odnako imeetsya vozmozhnost' vychislit' razmer, peredvinuv ukazatel' fajla s nachala na konec fajla. Pri otkrytii fajla ukazatel' fajla avto- maticheski ustanavlivaetsya na pervyj bajt fajla. Ukazatel' fajla peremeshchaetsya funkciej 42H preryvaniya 21H. Nado pomestit' v AL kodovoe chislo 2, napralyayushchee ukazatel' na konec fajla. V BX dol- zhen byt' ukazan nomer fajla, a CX:DX soderzhit smeshchenie ot konca fajla do pozicii, v kotoruyu dolzhen byt' ustanovlen ukazatel', poetomu pomestite 0 v oba etih registra. Zatem vyzovite funkciyu. Pri vozvrate DX:AX budet soderzhat' novuyu poziciyu ukazatelya, otno- sitel'no ego predydushchej pozicii - t.e. budet soderzhat' dlinu fajla (DX soderzhit starshij bajt). Pri vozniknovenii oshibki budet ustanovlen flag perenosa, a v AX budet vozvrashcheno 1, esli nepra- vilen nomer funkcii i 6, esli nepravilen nomer fajla. Ne zabud'te zatem snova vernut' ukazatel' na nachalo fajla, esli eto neobhodi- mo. Pomestite 0 v AL, CX i DX i vyzovite funkciyu snova. Vot pri- mer: ;---otkryvaem fajl LEA DX,FILE_PATH ;DS:DX ukazyvayut na put' fajla MOV AL,0 ;otkryvaem dlya chteniya MOV AH,3DH ;funkciya otkrytiya fajla INT 21H ;otkryvaem ego JC OPEN_ERROR ;proverka na oshibku MOV HANDLE,AX ;zapominaem nomer fajla ;---opredelyaem dlinu fajla MOV AH,42H ;funkciya peremeshcheniya ukazatelya MOV AL,2 ;kod ustanovki na konec fajla MOV BX,HANDLE ;nomer fajla v BX MOV CX,0 ;0 v CX i DX MOV DX,0 ; INT 21H ;sdvigaem ukazatel' JC POINTER_ERROR ;oshibka? MOV FSIZE_HIGH,DX ;zapominaem razmer fajla MOV FSIZE_LOW,DX ; 5.1.4 Vosstanovlenie posle oshibok, svyazannyh s nehvatkoj prostranstva na diske. Pri popytke zapisi na polnyj disk mozhet proizojti krah prog- rammy. CHasto legko izbezhat' etogo, dazhe v Bejsike, proveriv pred- varitel'no nalichie diskovogo prostranstva [5.1.2]. Odnako, esli oshibka proizoshla, to postarajtes' dat' pol'zovatelyu vozmozhnost' ispravit' ee. Pozvol'te emu sohranit' tol'ko chast' dannyh ili steret' kakoj-nibud' drugoj fajl i povtorit' popytku. Ili, eshche bolee radikal'noe sredstvo, pozvol'te pol'zovatelyu vstavit' dru- guyu disketu. Poslednij podhod dolzhen realizovyvat'sya s bol'shoj ostorozhnost'yu. Snachala zakrojte vse otkrytye fajly. Zatem vydajte zapros na smenu diskety. Posle togo, kak pol'zovatel' soobshchit, chto novaya disketa na meste, sozdajte novyj fajl i zapishite tuda dannye. Vysokij uroven'. V Bejsike nado ustanovit' proceduru obrabotki oshibok, kak pokazano v [7.2.5]. Esli operator Bejsika delaet popytku pisat' na polnyj disk, to vozvrashchaetsya kod oshibki #61. Pri etom upravle- nie mozhet byt' peredano procedure obrabotki oshibok, kotoraya in- formiruet pol'zovatelya o probleme i pozvolyaet emu spravit'sya s nej, ne teryaya dannyh. 100 ON ERROR GOTO 5000 'razreshaem obrabotku oshibok . . 200 OPEN FNAME$ FOR OUTPUT AS #1 'otkryvaem fajl 210 FOR N = 1 TO ARRLEN 'nachinaem pisat' massiv na disk 220 PRINT #1, ARRAY$(N) 'zapisyvaem odin element 230 NEXT ' . . 5000 IF ERR = 61 THEN 5100 'disk polon? 5100 IF ERR = ... 'drugie oshibki ... . 5100 '''vosstanovlenie pri perepolnenii diska 5110 BEEP: PRINT "Disk full - choose an option:" 5120 PRINT "(A) - Re-edit the file" 5130 PRINT "(B) - Delete some other file from disk" 5140 PRINT "(C) - Use different diskette" . (zdes' idet procedura vosstanovleniya) . 5500 RESUME Srednij uroven'. Vse funkcii DOS, kotorye pishut na disk, vydayut opredelennyj kod oshibki pri popytke zapisi na polnyj disk. Vot svodka etih kodov: Metod dostupa Funkciya Nazvanie Kod oshibki FCB 15H Posledovatel'naya zapis' AL = 1 FCB 22H Pryamaya zapis' AL = 1 FCB 27H Pryamaya zapis' bloka AL = 1 Deskriptor 40H Zapis' v fajl/ustrojstvo CX <> BX Proveryajte eti oshibochnye usloviya posle kazhdoj zapisi na disk. Poskol'ku kriticheskoj oshibki ne proishodit, to vosstanovlenie ne vyzyvaet problem. Nado tol'ko proveryat' na oshibku kazhdyj raz kogda Vy vyzyvaete odnu iz etih funkcij i sozdat' horoshuyu proce- duru obrabotki oshibok po Vashemu vkusu. Razdel 2. Rabota s katalogami diska. Kazhdyj disk imeet odin kornevoj katalog, s kotorogo nachinaetsya poisk vseh ostal'nyh katalogov. Kornevoj katalog mozhet soderzhat' elementy, ukazyvayushchie na podkatalogi, kotorye v svoyu ochered' mogut soderzhat' ssylki na drugie podkatalogi, obrazuya drevovidnuyu strukturu katalogov. Kornevoj katalog vsegda raspolozhen v oprede- lennyh sektorah diska; podkatalogi hranyatsya kak obychnye diskovye fajly, poetomu oni mogut byt' raspolozheny v lyubom meste diska. Otmetim, chto fiksirovannyj disk mozhet soderzhat' do chetyreh korne- vyh katalogov, esli on razbit na razdely, hotya MS DOS "vidit" tol'ko odin kornevoj katalog. Katalogi mogut imet' razlichnye razmery, v zavisimosti ot razmera diska i ego razbieniya na razde- ly. V sleduyushchej tablice privedeny razmery i pozicii kornevyh katalogov dlya raznyh tipov diskov: Tip diska Razmer kataloga CHislo elementov Nachal'nyj sektor disketa 160K 4 sektora 64 9 disketa 180K 4 sektora 64 9 disketa 320K 7 sektorov 112 15 disketa 360K 7 sektorov 112 15 disketa 1.2M 14 sektorov 224 29 zhestkij 10M ----------peremennye------------ zhestkij 20M ----------peremennye------------ V zavisimosti ot razbieniya na razdely fiksirovannyj disk mozhet imet' razlichnye razmery kataloga i nomer nachal'nogo sektora. Esli ves' disk otveden dlya MS DOS, to na XT i AT pod kornevoj katalog otvoditsya 32 sektora, chto pozvolyaet imet' v nem 512 elementov. Kak kornevoj katalog, tak i podkatalogi, ispol'zuyut 32 bajta dlya hraneniya informacii ob odnom fajle, nezavisimo ot tipa diska. Takim obrazom v kazhdom sektore mozhet hranit'sya informaciya o 16-ti elementah kataloga. Kazhdoe 32-bajtnoe pole razbito sleduyushchim obrazom: bajty 0-7 Imya fajla 8-10 Rasshirenie fajla 11 Atribut fajla 12-21 Zarezervirovano 22-23 Vremya poslednego dostupa k fajlu 24-25 Data poslednego dostupa k fajlu 26-27 Nachal'nyj klaster 28-31 Razmer fajla Tochka mezhdu imenem fajla i ego 3-bajtnym rasshireniem ne hranitsya. Vse polya vyravneny na levuyu granicu, a pustye bajty zapolnyayutsya probelami (kod ASCII 32). Atribut fajla opredelyaet yavlyaetsya li fajl spryatannym, zashchishchennym ot zapisi i t.d. [5.2.6]. On opred- lyaet takzhe special'nye elementy kataloga, takie kak podkatalogi ili metka toma. Informaciya o vremeni i date upakovana, poetomu dlya chteniya etih znachenij trebuyutsya bitovye operacii [5.2.5]. Nachal'nyj klaster ukazyvaet na poziciyu v tablice razmeshcheniya fajlov (FAT), kotoraya obsuzhdalas' v [5.1.1]. FAT hranit informa- ciyu o svobodnom prostranstve na diske, a takzhe otvodit sektora pri zapisi fajla. FAT otvodit diskovoe prostranstvo porciyami, bol'shimi chem 1 sektor, kotorye nazyvayutsya klasterami. Fajl raspo- lozhen v cepochke klasterov i FAT soderzhit sootvetstvuyushchuyu cepochku elementov, ukazyvayushchih, gde eti klastery raspolozheny na diske. Katalog dolzhen ukazyvat' na nachal'noe zveno cepochki elementov fajla v FAT, i eta informaciya soderzhitsya v pole nachal'nyj nomer klastera. Poskol'ku fajl obychno zanimaet poslednij otvedennyj emu klaster ne celikom, to pole razmer fajla hranit tochnuyu dlinu fajla v bajtah. 5.2.1 CHtenie/izmenenie kornevogo kataloga. Katalogi diska podrazdelyayutsya na kornevoj katalog (obsuzhdaemyj zdes') i podkatalogi (obsuzhdaemye v [5.2.3]). Kogda pol'zovatel' programmy vvodit imya kakogo-libo fajla dlya raboty, to byvaet poleznym proverit', imeetsya li etot fajl na samom dele. Obychno izmeneniya v kornevom kataloge proizvodyatsya v hode obychnyh fajlo- vyh operacij ili s pomoshch'yu special'nyh funkcij DOS. Odnako mozhno rabotat' s katalogom napryamuyu. Bol'shaya nuzhda v takom podhode voznikaet pri rabote na yazykah vysokogo urovnya, gde utility DOS po bol'shej chasti nedostupny. Kornevoj katalog chitaetsya i izmenyaetsya zagruzkoj ego v pamyat' s ispol'zovaniem podhoda, pokazannogo v [5.4.2], kogda chitayutsya absolyutnye sektora diska. |ti operacii ne ostavlyayut mesta mezhdu sektorami, kogda oni zagruzhayutsya v pamyat'. Bufer, soderzhashchij dannye sektora, mozhet rassmatrivat'sya kak nabor 32-bajtnyh polej i para ukazatelej, kotorye mogut ispol'zovat'sya dlya dvizheniya po katalogu. Odin ukazatel' vsegda kraten 32 i ukazyvaet na nachalo elementa kataloga. Vtoroj ukazatel' dobavlyaetsya k pervomu i uka- zyvaet na odno iz polej v 32-bajtnom elemente. Dannye v pamyati mogut byt' izmeneny trebuemym obrazom, a zatem ves' bufer zapisy- vaetsya obratno na disk. Imeetsya dva metoda chteniya absolyutnyh sektorov diska i v oboih sluchayah tol'ko odno chislo otlichaet sluchai chteniya i zapisi. Pos- kol'ku oshibka pri zapisi na disk mozhet legko povredit' vse soder- zhimoe diska, to nado dejstvovat' akkuratno. Snachala ubedites', chto operaciya chteniya sektora vypolnena verno vo vseh otnosheniyah. Posle etogo mozhno poprobovat' zapisat' na disk, vzyav tochnuyu kopiyu koda, ispol'zovannogo dlya chteniya i zameniv tol'ko nomer funkcii. Vysokij uroven'. Bejsik vyvodit katalog po komande FILES. Pri etom vyvodyatsya tol'ko imena fajlov. FILES daet katalog nakopitelya po umolchaniyu; dlya ukazaniya nakopitelya napishite FILES "A:" i t.d. Mozhno potrebo- vat', chtoby byla vyvedena informaciya ob otdel'nom fajle, napisav FILES "A:MYFILE.DAT". Kak i v operacionnoj sisteme imya fajla mozhet soderzhat' * i ?. Operator FILES snabzhaet informaciej pol'- zovatelya, no inogda nalichie nekotorogo fajla hochet proverit' programma. V etom sluchae nado otkryt' fajl dlya posledovatel'nogo chteniya i esli on ne sushchestvuet, to vozniknet oshibochnaya situaciya. Smotrite obsuzhdenie i primer v [5.2.3]. Dlya poiska lyuboj informacii, otnosyashchejsya k kornevomu katalogu, ispol'zujte proceduru na mashinnom yazyke, privedennuyu v [5.4.2]. Posle togo kak dannye kataloga v pamyati, ustanovite ukazateli, kak opisano vyshe, i vedite poisk po buferu pamyati s 32-bajtnym intervalom. Nizheprivedennyj primer ishchet element kataloga, otnosya- shchijsya k stertomu fajlu. Kogda fajl stiraetsya, to pervyj bajt imeni fajla zamenyaetsya na E5H, no vse ostal'noe soderzhimoe danno- go elementa ostaetsya neizmennym. Konechno, pri etom osvobozhdaetsya diskovoe prostranstvo, otvedennoe fajlu v FAT. Procedura vossta- novleniya udalennogo fajla dolzhna znat' nomer nachal'nogo klastera v FAT. V primere etot 2-bajtnyj nomer klastera pomeshchaetsya so smeshcheniem 26 v elemente kataloga. 100 '''chtenie sektorov kataloga v pamyat' s segmenta &H2000 110 INPUT "Enter erased filename ", FNAME$ 120 IF LEN(FNAME$) > 12 THEN BEEP: GOTO 110 130 IF INSTR(FNAME$,".") > 9 THEN BEEP: GOTO 110 140 '''dopolnenie imeni i rasshireniya fajla nulyami 150 Y = INSTR(FNAME$,".") 160 IF Y = 0 THEN FIRSTPART$ = FNAME$: GOTO 230 170 EXTEN$ = LEFT$(FNAME$, LEN(FNAME$) - Y) 180 EXTEN$ = EXTEN$ + STRING$(3 - LEN(EXTEN$),"") 190 FIRSTPART$ = RIGHT$(FNAME$,Y - 1) 200 FIRSTPART$ = FIRSTPART$ + STRING$(8 - LEN(FIRSTPART$),"") 210 FNAME$ = FIRSTPART$ + EXTEN$ 220 '''teper' hotim najti udalennyj fajl 230 MID$(FNAME$,1,1) = CHR$(&HE5) 'zamenyaem pervyj simvol 240 DIRPTR = 0 'ukazatel' na element 250 FIELDPTR = 26 'ukazatel' na nomer klastera 260 FOR N = 1 TO 112 'na diskete 112 elementov 270 X$ = "" 'chistim X$ 280 FOR M = 0 TO 10 'chitaem imya fajla iz kataloga 290 X$ = X$ + PEEK(DIRPTR + M) 'berem po simvolu 300 NEXT ' 310 IF X$ = FNAME$ THEN 340 'sovpadaet s vvedennoj strokoj 320 NEXT 'esli net, to sleduyushchij 330 PRINT "Too late - file entry obliterated": END 'uzhe net 340 X = PEEK(DIRPTR + FIELDPTR) 'nashli ego, berem 1-j bajt i 350 Y = PEEK(DIRPTR + FIELDPTR + 1) '2-j bajt nomera klastera 360 Z = X + 256*Y 'teper' nomer klastera v Z Srednij uroven'. MS DOS obespechivaet dve pary funkcij dlya poiska fajlov, odna dlya fajlov, otkrytyh metodom upravlyayushchih blokov fajla, a drugaya - dlya fajlov, otkrytyh metodom deskriptora fajlov. Odna iz funkcij kazhdoj pary ishchet pervoe poyavlenie imeni fajla v kataloge, a dru- gaya ishchet posleduyushchie poyavleniya, kogda v imeni fajla soderzhatsya dzhokery. Tol'ko metod, ispol'zuyushchij deskriptor fajla pozvolyaet iskat' podkatalogi. Metod FCB: Funkciya 11H preryvaniya 21H ishchet pervoe poyavlenie fajla. Usta- novite DS:DX na neotkrytyj FCB i vypolnite funkciyu. Pri vozvrate AL budet soderzhat' 0, esli fajl najden, i FF - esli net. DTA zapolnyaetsya informaciej iz kataloga. Dlya obychnyh FCB pervyj bajt DTA soderzhit nomer nakopitelya (1 = A i t.d.), a sleduyushchie 32 bajta soderzhat element kataloga. Dlya rasshirennogo FCB pervye 7 bajtov fajla kopiruyutsya v pervye 7 bajtov rasshirennogo FCB, vos'- moj bajt ukazyvaet na nakopitel', a sleduyushchie 32 bajta - element kataloga. ;---v segmente dannyh FCB DB 1,'NEWDATABAK',25DUP(0) ;---ishchem fajl MOV AH,11H ;funkciya poiska v kataloge LEA DX,FCB ;ukazyvaem na FCB INT 21H ;ishchem CMP AL,0 ;uspeshno? JNE NO_FILE ;esli net, to procedura obrabotki oshibki LEA BX,DTA ;teper' DS:BX ukazyvaet na element kataloga Posle ispol'zovaniya funkcii 11H mozhno ispol'zovat' funkciyu 12H dlya poiska sleduyushchih podhodyashchih elementov, kogda imya fajla soder- zhit dzhokery. V dannom sluchae v imeni fajla dopustim tol'ko simvol "?", no ne "*". |ta funkciya rabotaet v tochnosti tak zhe, kak i pervaya, i esli najden vtoroj fajl, to informaciya o pervom fajle v DTA budet unichtozhena povtornoj zapis'yu. Metod deskriptora fajlov: Funkciya 4EH preryvaniya 21H ishchet fajl s dannym imenem. DS:DX dolzhny ukazyvat' na stroku, dayushchuyu put' fajla. Naprimer, B:\EURO- PE\FRANCE\PARIS ukazyvaet na fajl PARIS. Stroka mozhet soderzhat' do 63 simvolov i zavershat'sya simvolom ASCII 0. Imya fajla mozhet soderzhat' dzhokery, vklyuchaya kak "?", tak i "*". Pomestite atribut fajla v CX; esli on obychnyj to 0, v protivnom sluchae prokonsul'- tirujtes' v [5.2.6] otnositel'no znachenij atributa. Pri vozvraet ustanavlivaetsya flag perenosa, esli fajl ne naj- den. Esli fajl najden, to funkciya zapolnyaet DTA informaciej o fajle. Otmetim chastnyj sluchaj ispol'zovaniya DTA metodom deskrip- tora fajlov - obychno, DTA ispol'zuetsya funkciyami MS DOS dlya rabo- ty cherez FCB. Pervye 21 bajt DTA zarezervirovany DOS dlya poiska sleduyushchih sovpadayushchih fajlov. Dvadcat' vtoroj bajt daet atribut fajla, za nim sleduyut dva bajta, soderzhashchie vremya i eshche dva bajta soderzhashchie datu. Sleduyushchie 4 bajta soderzhat razmer fajla (mladshee slovo snachala). I, nakonec, daetsya imya fajla v vide stroki pere- mennoj dliny, zakanchivayushchejsya bajtom ASCII 0. Tochka (ASCII 46) razdelyaet imya i rasshirenie i ne odin iz etih elementov ne zapol- nen probelami. ;---v segmente dannyh PATH DB 'B:FRANCE\PARIS\4EME',0 ;---ishchem fajl MOV AH,4EH ;nomer funkcii LEA DX,PATH ;DS:DX ukazyvayut na put' MOV CX,0 ;obychnyj atribut fajla INT 21H ;ishchem fajl JC NO_FILE ;uhod, esli ne najden LEA BX,DTA ;DS:BX ukazyvayut na DTA MOV AL,[BX]+21 ;teper' atribut fajla v AL Sleduyushchee poyavlenie imeni fajla (kogda ispol'zuyutsya dzhokery) ishchetsya s pomoshch'yu funkcii 4FH preryvaniya 21H. Ona gotovitsya v tochnosti tak zhe, kak i funkciya 4EH, pri etom ukazatel' DTA ne dolzhen menyat'sya. Kogda drugih sovpadenij ne najdeno, to ustanav- livaetsya flag perenosa, a v AX poyavlyaetsya 18. 5.2.2 Sozdanie/udalenie podkataloga. Programma mozhet sozdavat' ili udalyat' podkatalogi, pri vypol- nenii nekotoryh uslovij. Dlya sozdaniya podkataloga neobhodimo, chtoby bylo po krajnej mere odno pustoe mesto v kornevom kataloge. Dlya udaleniya podkataloga neobhodimo, chtoby on ne soderzhal fajlov ili ssylok na drugie podkatalogi. Krome togo, Vy ne mozhete uda- lit' podkatalog, kotoryj yavlyaetsya Vashim tekushchim katalogom (tot, s kotorym po umolchaniyu vypolnyayutsya vse operacii nad katalogami). Otmetim takzhe, chto nevozmozhno udalit' kornevoj katalog. Vysokij uroven'. Bejsik predostavlyaet komandy MKDIR (sozdaj katalog) i RMDIR (udali katalog). Za obeimi dolzhny sledovat' standartnye puti ukazaniya kataloga, soderzhashchie do 63 simvolov, vklyuchaya imya nakopi- telya. Put' dolzhen byt' zaklyuchen v kavychki. CHtoby dobavit' podka- talog s imenem STORKS v podkatalog BIRDS napishite MKDIR "B:MAM- MALS\BIRDS\STORKS". Posle vypolneniya etoj komandy budet sozdan fajl STORKS, ispol'zuemyj kak podkatalog i fakt ego sushchestvovaniya budet otrazhen v sozdanii elementa s imenem STORKS v podkataloge s imenem BIRDS. Dlya udaleniya etogo podkataloga nado snachala udalit' iz nego vse fajly [5.3.2]. Zatem nado ispol'zovat' komandu RMDIR "B:MAMMALS\BIRDS\STORKS". V etih primerah predpolagalos', chto Vashim tekushchim katalogom yavlyalsya kornevoj katalog. Odnako, esli Vash tekushchij katalog naho- ditsya gde-to na puti k podkatalogu, nad kotorym osushchestvlyayutsya operacii, to net neobhodimosti ukazyvat' ves' put'. Poetomu, esli Vashim tekushchim katalogom yavlyaetsya BIRDS, to dlya sozdaniya ili uda- leniya podkataloga STORKS mozhno ispol'zovat' komandy MKDIR "\STORKS" ili RMDIR "\STORKS". Srednij uroven'. Poskol'ku upravlyayushchie bloki fajlov obsluzhivayut tol'ko kornevoj katalog, to dlya sozdaniya ili udaleniya podkataloga nado ispol'zo- vat' deskriptory fajlov. Sozdanie podkataloga: DS:DX dolzhny ukazyvat' na stroku, dayushchuyu nakopitel' i put' k katalogu, v kotorom dolzhen byt' sozdan podkatalog. Stroka dolzhna zavershat'sya bajtom ASCII 0. Dlya otkrytiya podkataloga s imenem PRIMATES v kornevom kataloge nakopitelya A: nado zapisat' stroku v vide "A:\PRIMATES". Dlya otkrytiya podkataloga v drugom podkataloge s imenem MAMMALS napishite "A:\MAMMALS\PRIMATES". Imya nakopitelya A: mozhet byt' opushcheno esli Vy rabotaete s nakopitelem, ispol'zue- mym po umolchaniyu, i put' mozhet nachinat'sya s tekushchego kataloga. Pomestite v AH 39H i vypolnite preryvanie 21H; esli ukazan pra- vil'nyj put', to budet sozdan novyj katalog. V protivnom sluchae budet ustanovlen flag perenosa, a AX budet soderzhat' kod oshibki 3 (put' neveren) ili 5 (net dostupa). V primere sozdaetsya podkata- log PRIMATES: ;---v segmente dannyh PATH DB 'A:MAMMALS\PRIMATES',0 ;---sozdaem podkatalog s imenem PRIMATES LEA DX,PATH ;DS:DX dolzhny ukazyvat' na put' MOV AH,39H ;nomer funkcii INT 21H ;sozdaem podkatalog JC ERROR_ROUT ;obrabotka oshibok Udalenie podkataloga: Dlya udaleniya podkataloga nado sformirovat' stroku, v tochnost'yu sovpadayushchuyu s toj, kotoruyu Vy ukazyvali pri sozdanii kataloga. Zatem pomestite v AH 3AH i vypolnite preryvanie 21H. Opyat' pri nevypolnenii funkcii v AX budut vozvrashcheny kody 3 ili 5 (kod 5 mozhet ukazyvat', chto katalog nepustoj). 5.2.3 CHtenie/izmenenie podkataloga. Podkatalogi vo mnogom podobny kornevomu katalogu, za isklyuche- niem togo, chto oni hranyatsya kak obychnye fajly, a ne v zaranee predopredelennyh sektorah. Podkatalogi nevozmozhno sputat' s obych- nymi fajlami, poskol'ku ob®ekt kataloga, otnosyashchijsya k podkatalo- gu, imeet special'nyj bajt atributov (s ustanovlennym bitom 5 - sm. [5.2.6]). Podkatalogi nachinayutsya s dvuh special'nyh 32-bajt- nyh ob®ektov, pervyj iz kotoryh imeet imya tochka, a vtoroj - dve tochki. Oni orientiruyut podkatalog sredi okruzhayushchih katalogov. Ssylki na podkatalogi nizhnego urovnya zapisyvayutsya kak obychnye ssylki na fajly. Predpolagaetsya, chto podkatalog mozhet byt' prochitan kak lyuboj drugoj fajl, poetomu vrode by ne sostavlyaet truda zagruzit' ego v pamyat'. No, k sozhaleniyu, sozdateli MS DOS pomestili 0 v pole dliny fajla dlya elementov, otnosyashchihsya k podkatalogam. V rezul'- tate DOS schitaet, chto etot fajl imeet nulevuyu dlinu i otkazyvaet- sya chitat' ego. Net prostogo sposoba preodolet' etu problemu. Vysokij uroven'. V Bejsike komanda FILES mozhet ispol'zovat' standartnye imena putej dlya vyvoda podkataloga; naprimer, FILES "B:MAMMALS\BIRDS" vyvodit vse fajly, soderzhashchiesya v podkataloge BIRDS. |ta komanda mozhet byt' ispol'zovana i dlya polucheniya informacii o nalichii v kataloge opredelennogo fajla. Naprimer, FILES "LEVEL1\NEWDATA" ishchet fajl NEWDATA i vyvodit ego imya, esli on najden. Hotya eto mozhet byt' poleznym dlya pol'zovatelya, no chasto samoj programme neobhodimo znat' sushchestvuet ili net ukazannyj fajl. CHtoby ustano- vit' eto popytajtes' otkryt' fajl dlya posledovatel'nogo chteniya. Esli on ne budet najden, to vozniknet oshibochnoe uslovie 63. Soz- dajte proceduru obrabotki oshibok, kak opisano v [5.4.8]. Zatem ispol'zujte peremennuyu, chtoby otmetit' byl li najden trebuemyj fajl (v nashem primere peremennaya "EXISTS"). Esli programme ne nuzhno, chto etot fajl byl otkryt, to zakrojte ego pered tem kak dvinut'sya dal'she. 100 ON ERROR GOTO 1000 'procedura obrabotki oshibok 110 EXISTS = 1 'nachal'noe znachenie "flaga" 120 INPUT "Enter filename: ",S$ 'zapros imeni fajla 130 OPEN S$ FOR INPUT AS #3 'otkryvaem ego dlya posled. chteniya 140 IF EXISTS = 0 THEN BEEP: PRINT "File does not exist" . . 1000 IF ERR = 53 THEN 1500 'fajl ne sushchestvuet? 1010 IF ERR = 64 THEN ... 'drugie oshibki . 1500 EXISTS = 0 'menyaem znachenie flaga 1510 RESUME 140 'prodolzhaem vypolnenie programmy Srednij uroven'. Funkcii raboty cherez deskriptory fajlov, kotorye ispol'zova- lis' dlya dostupa k kornevomu katalogu [5.2.1] mogut tak zhe prosto obrashchat'sya k lyubomu podkatalogu. CHtoby vyvesti vse soderzhimoe kataloga nado prosto ispol'zovat' funkciyu 4EH dlya poiska fajlov *.*, a zatem povtoryat' poisk, ispol'zuya funkciyu 4FH. Kogda bol'she ne budet fajlov, to budet ustanovlen flag perenosa, a AL budet soderzhat' 18. Kazhdyj raz, kogda budet obnaruzhen ocherednoj ele- ment, v DTA budet zapisana informaciya o fajle, vklyuchaya polnyj ego put' (otmechaem ispol'zovanie DTA v funkciyah, ispol'zuyushchih desk- riptor fajla). Sleduyushchij primer vyvodit polnye puti vseh obychnyh fajlov podkataloga. ;---v segmente dannyh PATH DB 'A:MAMMALS\*.*',0 DTAH DB 256 DUP(?) ;---ustanovka DTA LEA DX,DTA ;DS:DX ukazyvayut na DTA MOV AH,1AH ;funkciya ustanovki DTA INT 21H ;ustanavlivaem DTA ;---ishchem pervyj fajl MOV AH,4EH ;nomer funkcii LEA DX,PATH ;ukazyvaem na stroku puti MOV CX,0 ;tol'ko normal'nye atributy INT 21H ;ishchem *.* JC ERROR ;obrabotka oshibok ;---vyvodim imya fajla NEXT_LINE: LEA BX,DTA ;BX ukazyvaet na DTA ADD BX,30 ;smeshchenie dlya imeni fajla NEXT_CHAR: MOV DL,[BX] ;poluchaem simvol iz imeni CMP DL,0 ;proverka na konec stroki JE END_STR ;uhod, esli konec MOV AH,2 ;inache, vyodim simvol INT 21H ; INC BX ;uvelichivaem ukazatel' JMP SHORT NEXT_CHAR ;sleduyushchij simvol ;---vozvrat karetki/perevod stroki v konce stroki END_STR: MOV AH,2 ;funkciya vyvoda simvola MOV DL,13 ;kod vozvrata karetki INT 21H ;vyvodim MOV DL,10 ;kod perevoda stroki INT 21H ;vyvodim ;---ishchem sleduyushchij fajl LEA DX,PATH ;ukazyvaem na stroku puti MOV AH,4FH ;nomer funkcii INT 21H ;ishchem sleduyushchij fajl JC FINISHED ;esli net, to vyhod JMP SHORT NEXT_LINE ;inache vyvodim imya fajla FINISHED: 5.2.4 Poluchenie/ustanovka tekushchego kataloga. Tekushchij katalog eto katalog, v kotorom DOS ishchet fajl, dlya kotorogo ne ukazan put'. Esli ne ustanovleno protivnogo, to teku- shchij katalog yavlyaetsya kornevym katalogom. Vysokij uroven'. Bejsik ustanavlivaet tekushchij katalog s pomoshch'yu komandy CHDIR. Za komandoj dolzhna sledovat' stroka, ukazyvayushchaya put' k katalogu, na kotoryj nado perejti. Stroka mozhet soderzhat' do 63-h simvolov, vklyuchaya imya nakopitelya, i dolzhna byt' zaklyuchena v kavychki. CHDIR "C:MAMMALS\PRIMATES\GIBBONS" delaet podktalog GIBBONS tekushchim katalogom. CHtoby perejti v kornevoj katalog napishite CHDIR "\" ili CHDIR "B:\". Bejsik versii 3.0 mozhet soobshchat' put' k tekushchemu katalogu, kak eto delaet komanda DOS PATH. Prosto vvedite PRINT ENVI- RON$("PATH"). Srednij uroven'. Funkciya 3BH preryvaniya 21H ustanavlivaet tekushchij katalog. DS:DX dolzhny ukazyvat' na put' k katalogu v standartnom vide i eta stroka dolzhna zavershat'sya bajtom ASCII 0. Naprimer, B:BIRDS\- PARROTS\POLLY delaet POLLY tekushchim katalogom. B: mozhet byt' opu- shcheno, esli eto tekushchij nakopitel' po umolchaniyu [5.3.1]. CHtoby sdelat' tekushchim kornevoj katalog nakopitelya A: napishite A:\. V primere tekushchim katalogom ustanavlivaetsya POLLY: ;---v segmente dannyh PATH DB 'B:BIRDS\PARROTS\POLLY',0 ;---delaem POLLY tekushchim katalogom MOV AH,3BH ;nomer funkcii LEA DX,PATH ;DS:DX dolzhny ukazyvat' na put' INT 21H ;ustanavlivaem tekushchij katalog CHtoby opredelit' kakoj katalog yavlyaetsya tekushchim nado ispol'zo- vat' funkciyu 47H preryvaniya 21H. DS:SI dolzhny ukazyvat' na ob- last' dannyh razmerom 64 bajta, v kotoruyu budet zapisan put'. V DL ukazyvaetsya nakopitel', prichem 0 = "po umolchaniyu", 1 = A, 2 = B i t.d. Pri vozvrate funkciya vozvrashchaet stroku bez imeni nakopi- telya. Esli byl ukazan nesushchestvuyushchij nakopitel', to v AL vozvra- shchaetsya kod oshibki 15. Stroka nachin