Python: Obtén Mount Point en Windows o Linux

Necesito una función para determinar si un directorio es un punto de assembly para una unidad. Encontré este código que ya funciona bien para Linux:

def getmount(path): path = os.path.abspath(path) while path != os.path.sep: if os.path.ismount(path): return path path = os.path.abspath(os.path.join(path, os.pardir)) return path 

Pero no estoy seguro de cómo funcionaría esto en Windows. ¿Puedo asumir que el punto de assembly es la letra de la unidad (por ejemplo, C :)? Creo que es posible tener un assembly de red en Windows, así que también me gustaría poder detectar ese assembly.

Windows no solía llamarlos “puntos de assembly” [ edit : ¡ahora lo hace, vea más abajo!], Y las dos syntax típicas / tradicionales que puede encontrar para ellos son una letra de unidad, por ejemplo, Z: o else \\hostname (con dos barras invertidas iniciales: escape con cuidado o use r'...' notación r'...' en Python para tales cadenas literales).

edición : ya que los puntos de assembly NTFS 5.0 son compatibles, pero de acuerdo con este post, la API para ellos está en bastante estado: “roto y mal documentado”, dice el título del post. Tal vez ejecutar el mountvol.exe suministrado por microsoft es la forma menos dolorosa – mountvol drive:path /L debería emitir el nombre del volumen montado para la ruta especificada, o simplemente mountvol enumera tales assemblys (tengo que decir “debería” porque No puedo verificar ahora. Puede ejecutarlo con subprocess.Popen y comprobar su salida.

¿Desea encontrar el punto de assembly o simplemente determinar si es un punto de assembly?

Independientemente, como se comentó anteriormente, es posible en WinXP asignar una unidad lógica a una carpeta.

Consulte aquí para obtener más información: http://www.modzone.dk/forums/showthread.php?threadid=278

Probaría win32api.GetVolumeInformation

 >>> import win32api >>> win32api.GetVolumeInformation("C:\\") ('LABEL', 1280075370, 255, 459007, 'NTFS') >>> win32api.GetVolumeInformation("D:\\") ('CD LABEL', 2137801086, 110, 524293, 'CDFS') >>> win32api.GetVolumeInformation("C:\\TEST\\") # same as D: ('CD LABEL', 2137801086, 110, 524293, 'CDFS') >>> win32api.GetVolumeInformation("\\\\servername\\share\\") ('LABEL', -994499922, 255, 11, 'NTFS') >>> win32api.GetVolumeInformation("C:\\WINDOWS\\") # not a mount point Traceback (most recent call last): File "", line 1, in  pywintypes.error: (144, 'GetVolumeInformation', 'The directory is not a subdirectory of the root directory.') 

Aquí hay un código para devolver la ruta UNC señalada por una letra de unidad. Supongo que hay una forma más ingeniosa de hacer esto, pero pensé que contribuiría con mi pequeña parte.

 import sys,os,string,re,win32file for ch in string.uppercase: # use all uppercase letters, one at a time dl = ch + ":" try: flds = win32file.QueryDosDevice(dl).split("\x00") except: continue if re.search('^\\\\Device\\\\LanmanRedirector\\\\',flds[0]): flds2 = flds[0].split(":") st = flds2[1] n = st.find("\\") path = st[n:] print(path)