import ctypes
import string
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
GetLogicalDrives = kernel32.GetLogicalDrives
GetLogicalDrives.restype = ctypes.c_ulong # Dword
GetVolumeInformation = kernel32.GetVolumeInformationW
GetVolumeInformation.argtypes = [
ctypes.c_wchar_p,
ctypes.c_wchar_p,
ctypes.c_ulong,
ctypes.POINTER(ctypes.c_ulong),
ctypes.POINTER(ctypes.c_ulong),
ctypes.POINTER(ctypes.c_ulong),
ctypes.c_wchar_p,
ctypes.c_ulong
]
GetVolumeInformation.restype = ctypes.c_int
GetDiskFreeSpace = kernel32.GetDiskFreeSpaceW
GetDiskFreeSpace.argtypes = [
ctypes.c_wchar_p,
ctypes.POINTER(ctypes.c_ulong),
ctypes.POINTER(ctypes.c_ulong),
ctypes.POINTER(ctypes.c_ulong),
ctypes.POINTER(ctypes.c_ulong)
]
GetDiskFreeSpace.restype = ctypes.c_int # BOOL
def get_drive_info():
drive_mask = GetLogicalDrives()
print("\n")
print("╔" + "═" * 63 + "╗")
print("║ ИНФОРМАЦИЯ О ЛОГИЧЕСКИХ ДИСКАХ КОМПЬЮТЕРА" + " " * 17 + "║")
print("╚" + "═" * 63 + "╝")
for i, drive_letter in enumerate(string.ascii_uppercase):
if (drive_mask >> i) & 1:
root_path = f"{drive_letter}:\\"
print(f">> Том: {root_path}")
volume_name_size = 256
volume_name = ctypes.create_unicode_buffer(volume_name_size)
serial_number = ctypes.c_ulong()
max_component_len = ctypes.c_ulong()
file_system_flags = ctypes.c_ulong()
file_system_name_size = 256
file_system_name = ctypes.create_unicode_buffer(file_system_name_size)
success_vi = GetVolumeInformation(
root_path,
volume_name,
volume_name_size,
ctypes.byref(serial_number),
ctypes.byref(max_component_len),
ctypes.byref(file_system_flags),
file_system_name,
file_system_name_size
)
if success_vi:
print(f" - Имя тома: {volume_name.value}")
print(f" - Файловая система: {file_system_name.value}")
print(f" - Серийный номер: {serial_number.value:X}")
print(f" - Макс. длина компонента: {max_component_len.value} символов")
else:
print(f" - !! Не удалось получить информацию о томе (Код ошибки: {ctypes.get_last_error()}) !!")
sectors_per_cluster = ctypes.c_ulong()
bytes_per_sector = ctypes.c_ulong()
free_clusters = ctypes.c_ulong()
total_clusters = ctypes.c_ulong()
success_dfs = GetDiskFreeSpace(
root_path,
ctypes.byref(sectors_per_cluster),
ctypes.byref(bytes_per_sector),
ctypes.byref(free_clusters),
ctypes.byref(total_clusters)
)
if success_dfs:
bytes_per_cluster = sectors_per_cluster.value * bytes_per_sector.value
total_space_bytes = total_clusters.value * bytes_per_cluster
free_space_bytes = free_clusters.value * bytes_per_cluster
def format_bytes(bytes_value):
KB = 1024
MB = KB * 1024
GB = MB * 1024
TB = GB * 1024
if bytes_value >= TB:
return f"{bytes_value / TB:.2f} ТБ"
elif bytes_value >= GB:
return f"{bytes_value / GB:.2f} ГБ"
elif bytes_value >= MB:
return f"{bytes_value / MB:.2f} МБ"
elif bytes_value >= KB:
return f"{bytes_value / KB:.2f} КБ"
else:
return f"{bytes_value} байт"
print(" - Статистика дискового пространства:")
print(f" - Размер кластера: {format_bytes(bytes_per_cluster)}")
print(f" - Общее место: {format_bytes(total_space_bytes)}")
print(f" - Свободное место: {format_bytes(free_space_bytes)}")
print(f" - Кластеры (Общее/Свободное): {total_clusters.value} / {free_clusters.value}")
else:
print(f" - !! Не удалось получить статистику дискового пространства (Код ошибки: {ctypes.get_last_error()}) !!")
print("-" * 30)
if __name__ == "__main__":
try:
get_drive_info()
print()
input("Нажмите Enter для выхода...")
except Exception as e:
print(f"Критическая ошибка: {e}")
import traceback
traceback.print_exc()
input("Нажмите Enter для выхода...")