2017-07-02 7 views
-1

Ich kann RAM-Größe in Ordnung mit ctypes und MEMORYSTATUSEX() bekommen, aber ich habe Probleme, etwas für die Gesamtgröße der Festplatte (nicht verfügbarer Speicherplatz, aber Gesamtkapazität im Allgemeinen) zu finden.Wie erhält man die Gesamtgröße der Festplatte unter Windows?

+0

Ich glaube, Sie Antwort finden Sie [hier] (https://stackoverflow.com/a/276934/5805982) –

+0

@LexHobbit Das ist für RAM (Arbeitsspeicher) ist , nicht disk. – AlwaysQuestioning

+0

Oh, sorry U hat schon darüber geschrieben =) –

Antwort

2

hat Activestate eine recipe dafür, dass die Windows-GetDiskFreeSpaceEx Funktion verwendet. Es schien zu funktionieren, als ich einige begrenzte Tests gemacht habe, aber es hat eine Reihe von potentiellen Problemen, so ist hier eine stark verbesserte und viel mehr kugelsichere Version, die mindestens in Python 2.7+ bis 3.x funktioniert und nur eingebaute in Modulen.

@eryksun verdient die meisten der Kredit/Schuld für die Verbesserungen, seit (s) er ist offensichtlich ein Experte auf das Thema der Verwendung von ctypes.

import os 
import collections 
import ctypes 
import sys 

import locale 
locale.setlocale(locale.LC_ALL, '') # set locale to default to get thousands separators 

PULARGE_INTEGER = ctypes.POINTER(ctypes.c_ulonglong) # Pointer to large unsigned integer 
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) 
kernel32.GetDiskFreeSpaceExW.argtypes = (ctypes.c_wchar_p,) + (PULARGE_INTEGER,) * 3 

class UsageTuple(collections.namedtuple('UsageTuple', 'total, used, free')): 
    def __str__(self): 
     # Add thousands separator to numbers displayed 
     return self.__class__.__name__ + '(total={:n}, used={:n}, free={:n})'.format(*self) 

def disk_usage(path): 
    if sys.version_info < (3,): # Python 2? 
     saved_conversion_mode = ctypes.set_conversion_mode('mbcs', 'strict') 
    else: 
     try: 
      path = os.fsdecode(path) # allows str or bytes (or os.PathLike in Python 3.6+) 
     except AttributeError: # fsdecode() not added until Python 3.2 
      pass 

    # Define variables to receive results when passed as "by reference" arguments 
    _, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), ctypes.c_ulonglong() 

    success = kernel32.GetDiskFreeSpaceExW(
          path, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free)) 
    if not success: 
     error_code = ctypes.get_last_error() 

    if sys.version_info < (3,): # Python 2? 
     ctypes.set_conversion_mode(*saved_conversion_mode) # restore conversion mode 

    if not success: 
     windows_error_message = ctypes.FormatError(error_code) 
     raise ctypes.WinError(error_code, '{} {!r}'.format(windows_error_message, path)) 

    used = total.value - free.value 
    return UsageTuple(total.value, used, free.value) 

if __name__ == '__main__': 
    print(disk_usage('C:/')) 

Beispielausgabe:

UsageTuple(total=102,025,392,128, used=66,308,366,336, free=35,717,025,792) 
-1

Dann sollten Sie diesen Code verwenden.

import win32com.client as com 


def TotalSize(drive): 
    """ Return the TotalSize of a shared drive [GB]""" 
    try: 
     fso = com.Dispatch("Scripting.FileSystemObject") 
     drv = fso.GetDrive(drive) 
     return drv.TotalSize/2**30 
    except: 
     return 0 

def FreeSpace(drive): 
    """ Return the FreeSape of a shared drive [GB]""" 
    try: 
     fso = com.Dispatch("Scripting.FileSystemObject") 
     drv = fso.GetDrive(drive) 
     return drv.FreeSpace/2**30 
    except: 
     return 0 

drive = r'C:' 
print 'TotalSize of %s = %d GB' % (drive, TotalSize(drive)) 
print 'FreeSapce on %s = %d GB' % (drive, FreeSapce(drive)) 

enter image description here

+0

Gibt 0 auf Python3 zurück – AlwaysQuestioning

Verwandte Themen