Python: получить точку монтирования в Windows или Linux - PullRequest
5 голосов
/ 16 июля 2009

Мне нужна функция, чтобы определить, является ли каталог точкой монтирования диска. Я уже нашел этот код, который хорошо работает для 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

Но я не уверен, как заставить это работать на окнах. Могу ли я просто предположить, что точка монтирования - это буква диска (например, C :)? Я полагаю, что возможно иметь сетевое монтирование на Windows, поэтому я хотел бы также иметь возможность обнаружить это монтирование.

Ответы [ 3 ]

3 голосов
/ 16 июля 2009

Хотите найти точку монтирования или просто определить, является ли она точкой монтирования?

Несмотря на это, как указано выше, в WinXP возможно сопоставить логический диск с папкой.

Подробнее см. Здесь: http://www.modzone.dk/forums/showthread.php?threadid=278

Я бы попробовал 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.')
3 голосов
/ 16 июля 2009

Windows не назвала их «точками монтирования» [ edit : теперь это так, см. Ниже!], И два типичных / традиционных синтаксиса, которые вы можете найти для них, это либо буква диска например, Z:, или же \\hostname (с двумя ведущими обратными слешами: избегайте осторожности или используйте запись r'...' в Python для таких литеральных строк).

edit : поскольку точки монтирования NTFS 5.0 поддерживаются, но согласно этому посту API для них находится в довольно хорошем состоянии - "сломан и плохо документирован", Заголовок сообщения говорит. Возможно, выполнение поставляемого Microsoft mountvol.exe является наименее болезненным способом - mountvol drive:path /L должен выдать имя подключенного тома для указанного пути, или просто mountvol такой список всех таких монтирований (мне нужно сказать "должен", потому что я не могу проверить прямо сейчас). Вы можете выполнить его с помощью subprocess.Popen и проверить его вывод.

0 голосов
/ 27 июля 2011

Вот некоторый код для возврата пути UNC, на который указывает буква диска. Я предполагаю, что есть более изящный способ сделать это, но я думал, что внесу свою маленькую часть.

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)
...