5

我需要一个函数来确定目录是否是驱动器的挂载点。我发现这段代码已经适用于 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 上工作。我可以假设挂载点是驱动器号(例如 C:) 吗?我相信可以在 Windows 上进行网络挂载,因此我也希望能够检测到该挂载。

4

3 回答 3

3

Windows 不习惯称它们为“挂载点”[编辑:现在确实如此,见下文!],您可以为它们找到的两种典型/传统语法是驱动器号,例如Z:,或者其他\\hostname(有两个前导反斜杠:小心转义或r'...'在 Python fpr 中使用符号这样的文字字符串)。

编辑:由于支持 NTFS 5.0 挂载点,但根据这篇文章,它们的 API 处于相当状态——“损坏且文档不完整”,文章的标题说。也许执行微软提供的mountvol.exe是最不痛苦的方式——mountvol drive:path /L应该为指定路径发出已安装的卷名,或者只是mountvol列出所有此类安装(我不得不说“应该”,因为我现在无法检查)。您可以执行它subprocess.Popen并检查其输出。

于 2009-07-16T15:25:10.997 回答
3

你想找到挂载点还是只是确定它是否是一个挂载点?

无论如何,如上所述,在 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.')
于 2009-07-16T18:56:57.043 回答
0

这是一些返回驱动器号指向的 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)
于 2011-07-26T20:04:24.283 回答