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.

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top