[python/win32] disk space

Pagina: 1
Acties:
  • 330 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Hoe krijg je in Python (in windows) de ruimte die nog vrij is op de harde schijf?

- os.statvfs is alleen voor unix

verder zie ik geen mogelijke functies door te googlen.
Hier staat een bericht van iemand die ook geen functie kon vinden: http://mail.python.org/pi...ev/2001-March/013706.html

Wat wel kan is met os.walk() en os.stat() de ruimte die bestanden innemen optellen en dan van de volledige schijfruimte aftrekken. Echter gaat dit niet helemaal goed, omdat de ruimte die een bestand inneemt op de harde schijf vaak meer is dan de daadwerkelijke grootte van het bestand. Een tekstbestand van 5 byte neemt in de praktijk bijv. 4 kilobyte in beslag.

Hier is het programmadeel dat de totale grootte van een directory berekent, echter heeft dit zoals gezegd het probleem dat de ruimte die de directory werkelijk op de disk inneemt niet berekend wordt.

code:
1
2
3
4
5
6
7
8
size=0
for root, dirs, files in os.walk(".\\filelists\\"):
    for name in files:
        filename=os.path.join(root,name)
        statinfo=os.stat(filename)
        print filename, statinfo[6]
        size=size+statinfo[6]
        print size,"bytes"


Ik vraag me dus af of er geen betere manier bestaat.
Vraag: hoe moet je de vrije ruimte op een harddisk opvragen?

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Nu heb ik van Python zelf geen kaas gegeten, maar blijkbaar kun je vanuit Python gewoon de Windows API gebruiken: http://aspn.activestate.c...sage/Python-win32/2537997.

En eigenlijk zou je eens moeten kijken of je op die manier de functie GetDiskFreeSpaceEx kunt aanroepen (of een vergelijkbare functie, GetDiskFreeSpaceEx was het eerste wat in me opkwam).

Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

MrBucket heeft helemaal gelijk en de benodigde DLL interfaces bestaan ook al een tijdje:
http://sourceforge.net/projects/pywin32/
code:
1
2
import win32file
(vrij_gebruiker, totaal, vrij) = win32file.GetDiskFreeSpaceEx(U"C:\\")

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Bedankt voor de antwoorden. Het is alleen jammer dat je voor de module win32file een aparte python-extensie moet installeren, en dat dit niet standaard in python zit. Dan moet ik nog even kijken welke methode ik prefereer, die met GetDiskFreeSpaceEx, of toch de methode met os.walk().

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • reusje
  • Registratie: Maart 2004
  • Laatst online: 06-05 22:17
Als je ActivePython gebruikt zitten de win32 extenties er wel standaard in.

http://download.activestate.com/ActivePython/windows/2.5/

Acties:
  • 0 Henk 'm!

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 20-07-2024

PommeFritz

...geen friet

Walking over alle files op je disk is natuurlijk enorm traag.

Je kunt ook ctypes gebruiken, deze module zit wel standaard in Python:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import ctypes

def getFreeDiskSpaceWin32(drive):
    freeuser = ctypes.c_int64()
    total = ctypes.c_int64()
    free = ctypes.c_int64()
    ctypes.windll.kernel32.GetDiskFreeSpaceExW(unicode(drive), 
            ctypes.byref(freeuser), ctypes.byref(total), ctypes.byref(free))
    return freeuser.value, total.value, free.value

def prettyPrintFreeSpace(drive):
    freeuser, total, free = getFreeDiskSpaceWin32(drive)
    print "Drive:",drive
    print "  free space: %.3f Gb" % (freeuser/1024.0/1024.0/1024.0)
    print "  available space: %.3f Gb" % (total/1024.0/1024.0/1024.0)

prettyPrintFreeSpace("c:")


Meer handige code hier : http://aspn.activestate.c...book/Python/Recipe/511491

FireFox - neem het web in eigen hand


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Bedankt voor de reacties. Ik heb de methode met os.walk() in mijn script gedaan, en dit lijkt toch wel redelijk te werken. Weliswaar is het wat aan de trage kant, en wordt de vrije ruimte niet exact berekend, maar de methode is toch aanvaardbaar, en bovendien het meest portable, zodat het script ook eventueel onder unix kan draaien. Ctypes is een beetje ingewikkeld, ActivePython zou ook wel kunnen.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 10-04 21:30
Een script dat 15 minuten of meer nodig heeft om vrije schijfruimte te berekenen is abnormaal.
Het script geeft altijd verkeerde resultaten omdat je directories niet mee telt.
Het script geeft altijd verkeerde resultaten omdat je niet omhoog afrondt naar de clustersize.
Het script geeft verkeerde resultaten wanneer er symlinks/junctions op de schijf staan (standaard zijn die te vinden in Vista en *nix, en handmatig te maken op andere OSen).
Het script geeft verkeerde resultaten wanneer een schijf is gemount in een pad ipv als driveletter (gaat fout bij alle *nix OSen en kan fout gaan op windows)
Netwerkschijven geven verkeerde resultaten.

Ik denk dat je nog eens heel goed moet nadenken voordat je een gebruiker met al deze problemen opzadelt.

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Bovendien weet je dan alsnog niet de vrije ruimte, maar alleen de gebruikte ruimte. Voor het bepalen hoe groot de schijf is heb je dan alsnog een platformafhankelijke functie nodig.

Los daarvan, waarvoor heb je het nodig? Wil je de gebruiker een indicatie geven of wil je zelf uitrekenen of een bestand past en het dan pas plaatsen?

Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
_js_ schreef op zondag 07 oktober 2007 @ 18:21:
Een script dat 15 minuten of meer nodig heeft om vrije schijfruimte te berekenen is abnormaal.
Het duurt in het algemeen enkele seconden.
Het script geeft altijd verkeerde resultaten omdat je directories niet mee telt.
Het script geeft altijd verkeerde resultaten omdat je niet omhoog afrondt naar de clustersize.
De meeste files zijn groot waardoor de afwijking dus klein is.
Ik denk dat je nog eens heel goed moet nadenken voordat je een gebruiker met al deze problemen opzadelt.
Het script is puur voor eigen gebruik.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
ValHallASW schreef op zondag 07 oktober 2007 @ 20:10:
Bovendien weet je dan alsnog niet de vrije ruimte, maar alleen de gebruikte ruimte. Voor het bepalen hoe groot de schijf is heb je dan alsnog een platformafhankelijke functie nodig.
Nee, want het script gebruikt altijd dezelfde harde schijf, waardoor de grootte van de harde schijf maar 1 keer hoeft te worden ingevoerd. Vervolgens kan de gebruikte ruimte daarvan af worden getrokken.
Los daarvan, waarvoor heb je het nodig? Wil je de gebruiker een indicatie geven of wil je zelf uitrekenen of een bestand past en het dan pas plaatsen?
De enige gebruiker ben ik zelf. Ik wil dus weten hoeveel vrije ruimte er nog op mijn harde schijven zijn.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Geef voortaan even van te voren in je TS aan dat je fundamenteel waardeloze oplossingen prefereert boven logische, precieze en voorspelbare oplossingen, dan hoeven wij geen moeite te doen om je te helpen.

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

.edit: oh nvm, ik lees niet goed.

[ Voor 92% gewijzigd door .oisyn op 08-10-2007 01:12 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Erik Jan schreef op maandag 08 oktober 2007 @ 00:54:
Geef voortaan even van te voren in je TS aan dat je fundamenteel waardeloze oplossingen prefereert boven logische, precieze en voorspelbare oplossingen, dan hoeven wij geen moeite te doen om je te helpen.
Os.walk() is behelpen, echter hebben de andere oplossingen die hier aangedragen worden allemaal nadelen. Ctypes is te ingewikkeld en GetDiskFreeSpaceEx heeft een aparte module nodig, hoewel je dus ook ActivePython kunt gebruiken. Er zijn imho dus 2 relevante oplossingen: os.walk() gebruiken, wat wel min of meer werkt, maar geen fraaie oplossing is, of ActivePython installeren. Op het moment heb ik de methode met os.walk() in mijn script gezet, als dat te slecht blijkt te werken dan installeer ik ActivePython. De methode met os.walk() is het meest "basic", gezien het feit dat daar slechts een standaard python-installatie voor nodig is.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
"Nee, want het script gebruikt altijd dezelfde harde schijf"->dan hoef je dus ook geen rekening te houden met andere os'es en kan je rustig de ctypes-methode gebruiken... die wordt je zelfs op een dienblad aangeboden dus ik snap echt niet wat je probleem daarmee is.
Pagina: 1