Питон:Получить точку монтирования в Windows или Linux
-
16-09-2019 - |
Вопрос
Мне нужна функция, чтобы определить, является ли каталог точкой монтирования диска.Я уже нашел этот код, который хорошо работает для 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
Но я не уверен, как заставить это работать в Windows.Могу ли я просто предположить, что точка монтирования — это буква диска (например,С:)?Я считаю, что в Windows возможно сетевое монтирование, поэтому я хотел бы также иметь возможность обнаружить это монтирование.
Решение
Windows не называла их «точками монтирования» [редактировать:теперь это так, см. ниже!], и два типичных/традиционных синтаксиса, которые вы можете найти для них, — это либо буква диска, например Z:
, или еще \\hostname
(с двумя обратными косыми чертами в начале:осторожно убегайте или используйте r'...'
обозначение в Python для таких литеральных строк).
редактировать:поскольку поддерживаются точки монтирования NTFS 5.0, но согласно эта почта API для них находится в довольно плохом состоянии — «сломанный и плохо документированный», как говорится в заголовке поста.Возможно, выполнение поставляемого Microsoft mountvol.exe это наименее болезненный способ - mountvol drive:path /L
должен выдать имя смонтированного тома по указанному пути или просто mountvol
такой список всех таких монтировок (я должен сказать «должен», потому что сейчас не могу проверить).Вы можете выполнить его с помощью subprocess.Popen
и проверьте его вывод.
Другие советы
Вы хотите найти точку монтирования или просто определить, является ли это точкой монтирования?
Тем не менее, как отмечалось выше, в 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.')
Вот код для возврата пути 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)