Ist ein Pfad lokal oder auf einem Share?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hallo,

wie kann ich unter Windows feststellen, ob ein gegebener Pfad auf einem lokalen Laufwerk oder auf einem Share liegt?

Hintergrund: in einer Windows-Applikation habe ich das Problem, daß ich wissen muß, ob ein Pfad auf einem lokalen Laufwerk oder auf einem Share liegt. Hintergrund ist, daß für die Hilfe CHM-Dateien benutzt werden, die über die IE-Engine geöffnet werden und entsprechende Sicherheitsprobleme aufwerfen. Die entsprechenden Dateien befinden sich in einem Pfad relativ zu der Applikation. Verschiebe ich meine Applikation auf ein Share, dann werden die nachzuladenden Dateien von der IE-Engine als unsicher klassifiziert. Ich möchte aber weder die systemweiten Sicherheitsrichtlinien, noch die Registry anpassen müssen.

Vielen Dank im Voraus

Wolfgang
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ws hat geschrieben:wie kann ich unter Windows feststellen, ob ein gegebener Pfad auf einem lokalen Laufwerk oder auf einem Share liegt?
Hallo Wolfgang!

Ich bin mir nicht sicher... probiere es mal mit ``os.path.ismount``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Hallo Gerold,

vielen Dank für den Tip. Leider liefert auch os.path.ismount(r"c:") True, d.h. daran kann ich nicht erkennen, ob es ein Netzwerklaufwerk ist. Eine Lösung gibt es, wenn man die win32-Module an Bord hat (ungetestet):

Code: Alles auswählen


def isPathOnNetworkDevice(pth):
    """
    Check if path pth is located on a network drive.
    """
    ret = False
    pth = os.path.abspath(pth)
    
    if os.path.exists(pth):
        # path exists, does it contain a drive letter?
        head, tail = os.path.splitdrive(pth)
        if head:
            try:
                win32net.NetUseGetInfo(None, pth)
                ret = True
            except pywintypes.error, e:
                # this is not a network drive
                pass
        else:
            # pth does not start with a drive letter, so it has to be
            # located on an network drive
            ret = True

    return ret
Gruß

Wolfgang
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Obige Lösung war noch etwas buggy, in Zeile 15 müßte es

Code: Alles auswählen

win32net.NetUseGetInfo(None, head)
heißen.

Gruß

Wolfgang
Benutzeravatar
mosenturm
User
Beiträge: 23
Registriert: Dienstag 15. Juli 2008, 17:54
Wohnort: Plauen
Kontaktdaten:

Wie wäre es mit:

os.path.splitunc()
Viele Grüße
Andreas
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mosenturm hat geschrieben:os.path.splitunc()
Wie hilft dir das, wenn der Share als Platte eingebunden ist, also quasi als Laufwerk sichtbar ist und keinen UNC-Pfad hat?

Ansonsten wäre es ja trivial, da müsste man nur schauen ob der Pfad mit ``\\`` anfängt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mosenturm
User
Beiträge: 23
Registriert: Dienstag 15. Juli 2008, 17:54
Wohnort: Plauen
Kontaktdaten:

Leonidas hat geschrieben:
mosenturm hat geschrieben:os.path.splitunc()
Wie hilft dir das, wenn der Share als Platte eingebunden ist, also quasi als Laufwerk sichtbar ist und keinen UNC-Pfad hat?
Kann ich leider nicht testen. Aber selbst wenn dem Share ein Laufwerksbuchstabe zugeordnet ist, ist doch irgendwo intern ein UNC Pfad vorhanden. Vielleicht kann das ja mal jemand testen.
Viele Grüße
Andreas
Benutzeravatar
mosenturm
User
Beiträge: 23
Registriert: Dienstag 15. Juli 2008, 17:54
Wohnort: Plauen
Kontaktdaten:

os.path.splitunc() macht ja nichts weiter, als einen String zu zerlegen. Ich dachte, hier werden irgendwelche OS-spezifische Befehle im Hintergrund ausgeführt.
Somit ist es natürlich nicht für die Problemlösung zu gebrauchen.

Es bleiben nur noch Windows-API aufrufe über das pywin32 Paket.
Unter folgenden Links gibt es dazu Infos (muss natürlich noch in Python umgesetzt werden ;-) ):
http://support.microsoft.com/support/kb ... 2/6/89.ASP
http://www.dbwiki.de/wiki.php?title=VBA ... _ermitteln
Viele Grüße
Andreas
Antworten