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 для выхода...")