2009-07-16 11 views
5

Ich brauche eine Funktion, um festzustellen, ob ein Verzeichnis ein Mount-Punkt für ein Laufwerk ist. Ich fand schon diesen Code, die gut für Linux funktioniert:Python: Mount Point unter Windows oder 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 

Aber ich bin nicht sicher, wie ich diese auf Windows arbeiten würde. Kann ich einfach annehmen, dass der Mount-Punkt der Laufwerksbuchstabe ist (z. B. C :)? Ich glaube, es ist möglich, ein Netzwerk-Mount unter Windows zu haben, so dass ich auch dieses Mount erkennen könnte.

+1

Es ist möglich, ein Laufwerk auf einem Pfad innerhalb eines Laufwerks in Windows installiert zu haben. Ich würde mir vorstellen, dass du in pywin32 nachsehen musst, um eine bessere Vorstellung davon zu bekommen, wie das geht. –

Antwort

3

Windows nannte sie nicht "mount points" [bearbeiten: es tut jetzt, siehe unten!], Und die beiden typischen/traditionellen Syntax, die Sie für sie finden können, sind entweder ein Laufwerksbuchstabe, z. Z: oder sonst \\hostname (mit zwei führenden Backslashes: vorsichtig entkommen oder r'...' Notation in Python für solche Literal-Strings verwenden).

bearbeiten: da NTFS 5.0-Mount-Punkte unterstützt werden, aber nach this post die API für sie ist in einem recht Zustand - „gebrochen und schlecht dokumentiert“, sagt der Post Titel. Vielleicht ist die Ausführung der Microsoft-mountvol.exe die am wenigsten schmerzhafte Art und Weise - mountvol drive:path /L sollte den Namen des gemounteten Volumes für den angegebenen Pfad oder nur mountvol solche Liste alle solche Halterungen ausgeben (ich muss sagen "sollte", weil ich nicht sofort überprüfen kann)). Sie können es mit subprocess.Popen ausführen und seine Ausgabe überprüfen.

+0

Es ist * möglich, ein Volume auch in einem anderen Laufwerk zu haben (obwohl ich mir nicht sicher bin, ob das die richtige Terminologie ist). –

+0

Ja, es ist, lassen Sie mich entsprechend bearbeiten. –

3

Möchten Sie den Einhängepunkt finden oder einfach feststellen, ob es sich um einen Einhängepunkt handelt?

Unabhängig davon, wie oben erwähnt, ist es in WinXP möglich, ein logisches Laufwerk einem Ordner zuzuordnen.

Siehe hier für weitere Details: http://www.modzone.dk/forums/showthread.php?threadid=278

Ich versuche 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.') 
+0

NB, dass die win32api ist aus einem Paket separat installiert http://sourceforge.net/projects/pywin32/files/ Vielen Dank für Ihre Antwort - es führte mich auch zu entdecken, wie man die DVD Festplatte tite – rogerdpack

0

Hier würde ist ein Code den UNC-Pfad durch einen Laufwerksbuchstaben wies auf zurückzukehren. Ich nehme an, es gibt einen besseren Weg, dies zu tun, aber ich dachte, ich würde meinen kleinen Teil beitragen.

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)