I would like to get a list of the removable drivers that are plugged in to the computer.
I think it can be done by using some registry, but I don’t know how exactly.
If there is another way I would like to hear about it.
Note: It’s important that I will be able to separate the removable drives from the fixed drives.
Advertisement
Answer
The algorithm is straightforward:
Call [MS.Docs]: GetGetLogicalDriveStringsW function, which will return a string containing all the existing rootdirs (e.g. C:\) separated by NUL (x00) chars
Iterate over the rootdirs and get each one’s type using [MS.Docs]: GetDriveTypeW function
Filter the removable drives (having the type DRIVE_REMOVABLE)
This is how it looks in Python (using PyWin32 wrappers). Add any of win32con.DRIVE_* constants to drive_types tuple to get different drive types combinations:
code00.py:
#!/usr/bin/env python import sys import win32con as wcon from win32api import GetLogicalDriveStrings from win32file import GetDriveType def get_drives_list(drive_types=(wcon.DRIVE_REMOVABLE,)): drives_str = GetLogicalDriveStrings() drives = (item for item in drives_str.split("x00") if item) return [item[:2] for item in drives if not drive_types or GetDriveType(item) in drive_types] def main(*argv): drive_filters_examples = ( (None, "All"), ((wcon.DRIVE_REMOVABLE,), "Removable"), ((wcon.DRIVE_FIXED, wcon.DRIVE_CDROM), "Fixed and CDROM"), ) for drive_types_tuple, display_text in drive_filters_examples: drives = get_drives_list(drive_types=drive_types_tuple) print("{:s} drives:".format(display_text)) for drive in drives: print("{:s} ".format(drive), end="") print("n") if __name__ == "__main__": print("Python {:s} {:03d}bit on {:s}n".format(" ".join(elem.strip() for elem in sys.version.split("n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform)) rc = main(*sys.argv[1:]) print("nDone.") sys.exit(rc)
Output:
[cfati@CFATI-5510-0:e:WorkDevStackOverflowq041465580]> "e:WorkDevVEnvspy_pc064_03.09_test0Scriptspython.exe" ./code00.py Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] 064bit on win32 All drives: C: D: E: F: G: H: I: L: M: N: Removable drives: H: I: Fixed and CDROM drives: C: D: E: F: G: L: M: N: Done.
As a side note, in my environment (at this point):
D: is a partition on an external (USB) HDD
H:, I: are partitions on a bootable USB stick (UEFI)
The rest are partitions on the (internal) SSD and / or HDD disks