[DOS/c++] used diskspace opvragen

Pagina: 1
Acties:

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 11:58
ben al een dag aan t googlen, maar ik ben opzoek naar een manier om vanuit dos (16bit dus) de gebruikte hd space van een schijf in een int op te slaan (afgerond dus, meer heb ik niet nodig).
Ben een klein simpel progje aan t maken dat bij de klant gedraaid kan worden en de kosten van een backup berekend (de n00bs hier maken nog wel eens rekenfouten).
Dit wil ik doen dmv een dos bootflop (komt vaak voor dat windows niet meer boot) en ntfs uitlezen heb ik al opgelost met ntfsdos.

heb hier en daar wat voorbeelde gevonden, maar werkt alleen onder win32...

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 29-07 17:11
in C# wordt de het aantal kb van een hd uitgelezen in een long. Je moet de dit getal dan converteren naar een int64 dacht ik. In c# zit dit er zo uit:
code:
1
System.Convert.ToInt64
. Hoe dit in c++ werkt zal wel te vinden zijn. Bedoel je dit eigenlijk wel?

stp - PSN ID: stp_4


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 12:52
  • Used disk space = total disk space - free disk space doen. Total en free disk space kan je toch wel opvragen?
  • De grootte van alle bestanden op de schijf bij elkaar optellen.
Beide methoden zijn niet helemaal nauwkeurig, omdat je rekening zou moeten houden van de clustersize van zowel de bronmedium als het doelmedium.

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 11:58
hoe ik het opvraag, dat is nou juist het probleem.... kan het niet vinden..
omzetten naar int ofzo is niet belangrijk, maar wel handig voor het rekensommetje.

Verwijderd

Je mag wel es ietsje beter leren googelen ;)
Wat je nodig hebt staat hier

  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 11:58
damn, ik ben niet zo'n ster in c++ proggen (paar modules op school gehad) maar ik dacht dat het wel in dos zou werken. kan geen 16bit dos project aanmaken in visual c++ 6 zie ik nu... zou toch moeten kunnen?

Verwijderd

Eh.

Nee.

Daarvoor heb je DOS compilers...


Edit: En laat ik je huiswerk maar meteen voor je doen, dat scheelt waarschijnlijk een round-trip in vragen: DJGPP is bijvoorbeeld een gratis C++ compiler voor DOS. Als je Cygwin installeert kun je ook voor de (gratis) Linux compilers gcc en g++ kiezen. Borland had wayback ook nog een C++ compiler voor DOS; ik krijg hem op hun site niet meer teruggevonden (al moet ik toegeven dat ik niet heel goed gezocht heb), dus ik kan niet zeggen of deze nog verkocht/ondersteund wordt, of dat het abandonware is geworden. In het laatste geval moet je 'm wel ergens op kunnen Googlen.

[ Voor 86% gewijzigd door Verwijderd op 01-10-2004 12:45 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 16-08 21:36
Nee, 16 bits mode is al een tijdje dood. Om precies te zijn, de laatste 16 bits versie van Visual C++ was 1.5. Dat is dus (2005+2003+2002+6+5+4+2) 7 versies terug :)

Afgezien daaran gaat het niet werken, om precies de reden die je zelf al aangeeft. Dos is 16 bits. Harddisks zijn iets groter dan dat. Je kunt weliswaar vanaf DOS2 de grootte als twee keer 16 bits krijgen, maar dat is nog steeds <4Gb.

Linux BootCD is waarschijnlijk zinniger, kijk naar Knoppix.

[ Voor 3% gewijzigd door MSalters op 01-10-2004 12:45 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

dos int21h, functie 36 geeft de vrije ruimte

source: http://www.ee.iitm.ernet.in/~ee01b044/interrupts.html#ah36

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Entry: DL = drive number (0=default, 1=A:, etc)

Return:

AX = FFFFh if invalid drive 
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 
this function does not return proper results on CD-ROMs; use AX=4402h"CD-ROM" instead 
SeeAlso: AH=1Bh,AH=1Ch,AX=4402h"CD-ROM"


Dus
gebruikt = (AX * CX * DX) - (AX * BX * CX) en dat valt nog te vereenvoudigen tot
gebruikt = AX * CX * (DX - BX)


Ieder register is 16-bits, dus total 48 bits. Zou moeten lukken als al die registers volledig gebruikt worden.

[ Voor 22% gewijzigd door Verwijderd op 01-10-2004 16:44 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 16-08 21:36
Nou, dat kan ik je dus al vertellen. Op praktisch alle disks is CX=bytes/sector 512. AX=Sectors/Cluster is typisch 2..128 (1K..64K clusters). Het probleem is dus dat je maximaal 65536 clusters van 64Kb hebt, oftewel precies 4Gb - wat ik eerder zei.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • sharkzor
  • Registratie: Maart 2000
  • Laatst online: 11:58
tja, das dus een probleem. ik ga nog wel het een en ander proberen(moet kunnen, andere dos progsels geven het ook goed weer), maar voorlopig heb ik het opgelost met een windows PE cd ;)
doet er wel lang over met booten, maar iniedergeval een goede berekening.

  • unclero
  • Registratie: Juni 2001
  • Laatst online: 15:55

unclero

MB EQA ftw \o/

Voor 16 bit C++ Compilers is Turbo C++ 1.01 ook een aanrader. Gratis, na volgens mij, registratieformuliertje ;).

Quelle chimère est-ce donc que l'homme? Quelle nouveauté, quel monstre, quel chaos, quel sujet de contradiction, quel prodige!

Pagina: 1