Python: Obtener Punto de montaje en Windows o Linux
-
16-09-2019 - |
Pregunta
Necesito una función para determinar si un directorio es un punto de montaje para una unidad. He encontrado este código ya que 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 iba a conseguir que esto funcione en Windows. ¿Puedo asumir el punto de montaje es la letra de unidad (por ejemplo, C :)? Creo que es posible tener una red de montaje en las ventanas por lo que me gustaría ser capaz de detectar que se montan también.
Solución
Windows no hizo uso de llamarlos "puntos de montaje" [ editar : ahora es así, consulte abajo!], Y las dos sintaxis típicos / tradicionales se puede encontrar para ellos son o bien una unidad letra, por ejemplo, Z:
o \\hostname
otra cosa. (con dos barras invertidas principales: escapar con cuidado, o utilizan la notación r'...'
en Python FPR dichas cadenas literales)
editar : desde NTFS 5,0 puntos de montaje son compatibles, pero de acuerdo a este post la API para ellos es bastante en un estado - 'roto y mal documentado', dice el título del mensaje. Tal vez de ejecutar el-Microsoft suministrado mountvol.exe es la forma menos dolorosa - mountvol drive:path /L
debe emitir el nombre del volumen montado para la ruta especificada, o simplemente mountvol
tales lista de todos los montajes de este tipo (que tengo que decir 'debería' porque no puedo comprobar ahora mismo). Puede ejecutarlo con subprocess.Popen
y comprobar su salida.
Otros consejos
¿Quieres encontrar el punto de montaje o simplemente determinar si se trata de un punto de montaje?
En cualquier caso, como se ha comentado anteriormente, es posible en WinXP para asignar una unidad lógica en una carpeta.
Vea aquí para más detalles: http://www.modzone.dk/ foros / showthread.php? threadid = 278
Me gustaría probar 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 "<stdin>", line 1, in <module>
pywintypes.error: (144, 'GetVolumeInformation', 'The directory is not a subdirectory of the root directory.')
Aquí hay un código para devolver la ruta de acceso UNC a la que apunta una letra de unidad. Supongo que es una forma más resbaladiza para hacer esto, pero pensé que aporto mi granito.
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)