Größe des freien Festplattenspeicherplatzes

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Größe des freien Festplattenspeicherplatzes

Beitrag von TomCat »

Hallo,

Gibt es eine Möglichkeit den noch freien Festplattenspeicherplatz zu bestimmen. Programmiere in Assembler.

THX TomCat
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Größe des freien Festplattenspeicherplatzes

Beitrag von wobo »

TomCat hat geschrieben:Hallo,

Gibt es eine Möglichkeit den noch freien Festplattenspeicherplatz zu bestimmen. Programmiere in Assembler.

THX TomCat
Kenne mich da nicht so richtig aus. Aber die DOS-Api liefert doch in Funktion $36 die verbleibende Festplattenkapzität des aktuellen Laufwerks zurück? Also Intr. $21, AH=$36, DL=0 --> if AX<>$ffff then Kapazität := CX*AX*BX (sagt meine Systemliteratur).
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Größe des freien Festplattenspeicherplatzes

Beitrag von freecrac »

wobo hat geschrieben:
TomCat hat geschrieben:Hallo,

Gibt es eine Möglichkeit den noch freien Festplattenspeicherplatz zu bestimmen. Programmiere in Assembler.

THX TomCat
Kenne mich da nicht so richtig aus. Aber die DOS-Api liefert doch in Funktion $36 die verbleibende Festplattenkapzität des aktuellen Laufwerks zurück? Also Intr. $21, AH=$36, DL=0 --> if AX<>$ffff then Kapazität := CX*AX*BX (sagt meine Systemliteratur).
Ja genau, allerdings nur für Partitionen bis 2 GB.

RBIL->inter61b.zip->Interrup.f
--------D-2136-------------------------------
INT 21 - DOS 2+ - GET FREE DISK SPACE
AH = 36h
DL = drive number (00h = default, 01h = A:, etc)
Return: AX = FFFFh if invalid drive
else
AX = sectors per cluster
BX = number of free clusters
CX = bytes per sector
DX = total clusters on drive
Notes: free space on drive in bytes is AX * BX * CX
total space on drive in bytes is AX * CX * DX
"lost clusters" are considered to be in use
according to Dave Williams' MS-DOS reference, the value in DX is
incorrect for non-default drives after ASSIGN is run
this function does not return proper results on CD-ROMs;
use AX=4402h"CD-ROM" instead
(FAT32 drive) the reported total and free space are limited to 2G-32K
should they exceed that value
SeeAlso: AH=1Bh,AH=1Ch,AX=4402h"CD-ROM",AX=7303h
Ich habe eine Batchdatei erstellt die dafür Debug benutzt.

Code: Alles auswählen

@echo off
if not (%1)==() goto DOIT
echo.
echo Fehler !!! Bitte Laufwerks-Buchstabe angeben.
echo Zum Beispeil: C[:] !
echo.
exit

:DOIT
if (%1)==(A:) set Drive=1
if (%1)==(B:) set Drive=2
if (%1)==(C:) set Drive=3
if (%1)==(D:) set Drive=4
if (%1)==(E:) set Drive=5
if (%1)==(F:) set Drive=6
if (%1)==(G:) set Drive=7
if (%1)==(H:) set Drive=8
if (%1)==(I:) set Drive=9
if (%1)==(J:) set Drive=a
if (%1)==(K:) set Drive=b
if (%1)==(L:) set Drive=c
if (%1)==(M:) set Drive=d
if (%1)==(N:) set Drive=e
if (%1)==(O:) set Drive=f
if (%1)==(P:) set Drive=10
if (%1)==(Q:) set Drive=11
if (%1)==(R:) set Drive=12
if (%1)==(S:) set Drive=13
if (%1)==(T:) set Drive=14
if (%1)==(U:) set Drive=15
if (%1)==(V:) set Drive=16
if (%1)==(W:) set Drive=17
if (%1)==(X:) set Drive=18
if (%1)==(Y:) set Drive=19
if (%1)==(Z:) set Drive=1a
if (%1)==(a:) set Drive=1
if (%1)==(b:) set Drive=2
if (%1)==(c:) set Drive=3
if (%1)==(d:) set Drive=4
if (%1)==(e:) set Drive=5
if (%1)==(f:) set Drive=6
if (%1)==(g:) set Drive=7
if (%1)==(h:) set Drive=8
if (%1)==(i:) set Drive=9
if (%1)==(j:) set Drive=a
if (%1)==(k:) set Drive=b
if (%1)==(l:) set Drive=c
if (%1)==(m:) set Drive=d
if (%1)==(n:) set Drive=e
if (%1)==(o:) set Drive=f
if (%1)==(p:) set Drive=10
if (%1)==(q:) set Drive=11
if (%1)==(r:) set Drive=12
if (%1)==(s:) set Drive=13
if (%1)==(t:) set Drive=14
if (%1)==(u:) set Drive=15
if (%1)==(v:) set Drive=16
if (%1)==(w:) set Drive=17
if (%1)==(x:) set Drive=18
if (%1)==(y:) set Drive=19
if (%1)==(z:) set Drive=1a
if (%1)==(A) set Drive=1
if (%1)==(B) set Drive=2
if (%1)==(C) set Drive=3
if (%1)==(D) set Drive=4
if (%1)==(E) set Drive=5
if (%1)==(F) set Drive=6
if (%1)==(G) set Drive=7
if (%1)==(H) set Drive=8
if (%1)==(I) set Drive=9
if (%1)==(J) set Drive=a
if (%1)==(K) set Drive=b
if (%1)==(L) set Drive=c
if (%1)==(M) set Drive=d
if (%1)==(N) set Drive=e
if (%1)==(O) set Drive=f
if (%1)==(P) set Drive=10
if (%1)==(Q) set Drive=11
if (%1)==(R) set Drive=12
if (%1)==(S) set Drive=13
if (%1)==(T) set Drive=14
if (%1)==(U) set Drive=15
if (%1)==(V) set Drive=16
if (%1)==(W) set Drive=17
if (%1)==(X) set Drive=18
if (%1)==(Y) set Drive=19
if (%1)==(Z) set Drive=1a
if (%1)==(a) set Drive=1
if (%1)==(b) set Drive=2
if (%1)==(c) set Drive=3
if (%1)==(d) set Drive=4
if (%1)==(e) set Drive=5
if (%1)==(f) set Drive=6
if (%1)==(g) set Drive=7
if (%1)==(h) set Drive=8
if (%1)==(i) set Drive=9
if (%1)==(j) set Drive=a
if (%1)==(k) set Drive=b
if (%1)==(l) set Drive=c
if (%1)==(m) set Drive=d
if (%1)==(n) set Drive=e
if (%1)==(o) set Drive=f
if (%1)==(p) set Drive=10
if (%1)==(q) set Drive=11
if (%1)==(r) set Drive=12
if (%1)==(s) set Drive=13
if (%1)==(t) set Drive=14
if (%1)==(u) set Drive=15
if (%1)==(v) set Drive=16
if (%1)==(w) set Drive=17
if (%1)==(x) set Drive=18
if (%1)==(y) set Drive=19
if (%1)==(z) set Drive=1a
echo ecs:100>tmp.deb
echo 8C C8 8E D8 8E C0 B2 %Drive% B4 36 CD 21 3D FF FF 74>>tmp.deb
echo ecs:110>>tmp.deb
echo 59 66 F7 E3 66 F7 E1 BF 00 02 B1 0A 66 BB 00 CA>>tmp.deb
echo ecs:120>>tmp.deb
echo 9A 3B 66 31 D2 66 F7 F3 04 30 66 89 D6 88 05 47>>tmp.deb
echo ecs:130>>tmp.deb
echo 66 89 D8 66 BB 0A 00 00 00 66 31 D2 66 F7 F3 66>>tmp.deb
echo ecs:140>>tmp.deb
echo 89 C3 66 89 F0 FE C9 75 D9 B9 0B 00 BE FF 01 BF>>tmp.deb
echo ecs:150>>tmp.deb
echo 00 02 49 46 83 F9 01 74 05 80 3C 30 74 F4 83 F9>>tmp.deb
echo ecs:160>>tmp.deb
echo 0A 74 07 89 CA FC F3 A4 89 D1 31 DB 3D FF FF 75>>tmp.deb
echo ecs:170>>tmp.deb
echo 02 31 C9>>tmp.deb
echo g=cs:100 173>>tmp.deb
echo n space.tmp>>tmp.deb
echo w cs:200>>tmp.deb
  REM echo ucs:100 171>>tmp.deb
echo q>>tmp.deb
debug <tmp.deb >nul
del tmp.deb
echo -Bytes auf Laufwerk %1>>space.tmp
type space.tmp
del space.tmp
Um den Debug-Code zu sehen:
a) Diese Zeile "REM echo ucs:100 171>>tmp.deb", vom "REM" befreien.
b) Diese Zeile: "debug <tmp.deb >nul" so ändern: "debug <tmp.deb >debug.tmp" !
c) Dann "debug.tmp" mit Textbetrachter öffnen.

-------------------------------------------------------------------------------------------------------------------
Von Herbert Kleebauer:
Wenn man schon Programm einbettet, gehts auch ein bißchen einfacher:

Code: Alles auswählen

@echo off
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>free.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>>free.com
echo ?@}I{uNWwN~VSIhHI?Exy?_wqq_tyy?]?lvls_if`LuK~~={eLsT?vNwvN>>free.com
echo e`NeHFeZv]e`v1ebv1eBH]elp[N?p[Inw`{ECCUqoCvx{OokQ?ljet@eIC>>free.com
echo EFDN\@hrxN@Se~bNw@hbeK?Srjx[?}A{x`LbAw@G`LKL0>>free.com
free c 1000000
if not errorlevel 1 echo more than 1000000 bytes free on drive c:
if errorlevel 2 echo error

-----------------------------------------------------------------------

usage: free drive nr
drive: @, a-z (@=current drive)
nr: decimal number
errorlevel: 0: free space > nr
1: free space < nr
2: error
source code see older posting

NOTE:
Win98 with more than 2 Gbyte free disk space:
DOS function 36h returns:
65526 free clusters
64 sector / cluster
512 byte/sector

= 2.147.155.968 byte

So the code can only be used for a test of max. 2 Gbyte free
disk space.
Ebenfalls von Herbert Kleebauer:
Ab Windows 95 OSR2 mit "GetDiskFreeSpaceExA"

Code: Alles auswählen

@echo off
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>free.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>free.com
echo T}{z}~@GwkCG@OEKcUt`}}@MqqCsy?seHC}_Phxr?@zAB`LrPEyoDt@Cj?>>free.com
echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>free.com
echo RFvAWVU?_YLTU@@?~UCo_R~RDW@?aW?@MU_AMy1GHs?Gw`LbLK@shM`S_d>>free.com
echo bD_nsDddlTr_sPdlnTcnaTv_xP_ngD_rhDhsrT_kkDhrtT_fmDRNCTILk?>>free.com
echo staThg_So_rPfnqTl`qTdq_ShtpTrdqThV_Sqrm@ILm?O?cOKRDP?@@?dx>>free.com
echo OdFWu?N?_B@J@??KD?HWA?UO[B_UO?R?VCAUO?WCR?WCE?U_F?DWA?CWB?>>free.com
echo ORO?ROV?DWO?IWO?RO[?RW{O[RO?mYW?wdsTGUs@OUA?UAU?LWA?_R_ok~>>free.com
echo WODWO?RO[AROiAROyAWOEBOcDCWHWOOUO?OGRGyHWOGRO?TWO?DRTTqrQ@>>free.com
echo kcmSkRkPFWO?rdLTf`rTnAdT?@wDQDJTKDMTmqr?kkcTO[RGOiRGOyRGOE>>free.com
echo RKDFWOshwTnqOTrdbTFUrPRsdTGcsTcm`TVdkDhqVTEdsTdkhTdFUShCsT>>free.com
echo EjrTddqT`oRTDdbT?@wDQ?g@g??P?PwRog?s??PC~?ipOST?H??@Ds?VPn>>free.com
echo }Ep??@EA?BEGsPUpgF`qjn?PoRTJ?G?PsRkN?_pSOBQpHrjtvR??PCoA?M>>free.com
echo H@QDnt?vFgW\waU{~?ipOGT?i??PQg?S??PCPQgDi??PT~?K?O?Oaj?{sd>>free.com
echo FThrCTqEjTRddTb`oTwDdTqd_SqnqTUI??sdrTqe_S=ddDa_?c?PYR?p?o>>free.com
echo gDBo??PCiLtPT~tN?OKOgb?w??PCg?iP?PkR@i?CPYgLO??POT~B??OCt?>>free.com
echo H[?i[CPZgLg??P?PZR?i?C?T~B??OC~?ipOGT?@??`Pk=K@??@WtUsBO`x>>free.com
echo qv?SdshTqd_SqnqTqXWO0x>>free.com

free.com>free.exe
del free.com
free.exe>free.bat
del free.exe
call free.bat
del free.bat
echo Auf dem augenblicklichen Laufwerk sind %free% MByte frei.
Dirk
Antworten