Hi,
ich versuche mich grade an einem Regulären Ausdrück zur Überprüfung von gültigen (absoluten) Pfaden. Zum einen Verzeichnis-Pfade, z.B. "C:\test", zum anderen Datei-Pfade, z.B. "C:\test\hallo.txt". Ich möchte also testen, ob ein String ein gültiger Verzeichnis- oder Datei-Pfad ist.
Mein bisheriger RegEx ist folgender:
^[A-Za-z]:\\.
Der Anfang muss ein Buchstabe sein (Laufwerk). Dann kommt ein Doppelpunkt, dann ein Backslash und dann beliebige Zeichen. Vor dem Laufwerksbuchstaben darf nichts stehen.
Mein Ziel ist folgendes. Ich möchte testen ob Verzeichnis-Pfade oder Datei-Pfade noch existieren.
Bevor ich aber mit File.Exists() die Pfade prüfe, möchte ich solche Pfade von der Prüfung ausschließen:
"C:\WINDOWS\system32\mscomct2.ocx, 10"
"C:\WINDOWS\system32\msvbvm60.dll\3"
Ich will NICHT den richtigen Pfad aus z.B. "C:\WINDOWS\system32\msvbvm60.dll\3" extrahieren, mir reichts, wen ich wüsste, dass es kein gültiger Pfad ist, dann erspar ich mir gleich die Prüfung.
Kennt vielleicht jemand ne nützliche Seite mit den am häufigsten gebrauchten Regulären Ausdrücken? Ich hab im Internet keinen fertigen Regex für gültige Pfade gefunden.
Danke
partyboy
Was ist denn an C:\WINDOWS\system32\msvbvm60.dll\3 ungültig?
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hier sollte sich was inden lassen:
www.regxlib.com
Du kannst aber auch die statische Methode System.IO.Path.IsPathRooted verwenden. Die prüft auch nicht im Dateisystem, nur den Pfad-String.
"C:\WINDOWS\system32\msvbvm60.dll\3"
Das ist übrigens ein gültiger Pfad. Die Dll-Datei könnte ja auch ein gleichbenannter Ordner sein.
Gruss
Pulpapex
Hi Leute,
danke erstmal für eure Antworten und für den Link über regex.
Mein Vorhaben ist folgendes: Ich habe eine Liste mit Strings. U.A. stehen dort auch Pfade drin. Ich möchte jetzt alle Datei- und Verzeichnis-Pfade aus der Liste holen und sie mit den Pfaden auf der Festplatte vergleichen.
Wenn ein Pfad aus der Liste nicht mehr auf der Festplatte vorhanden ist, fliegt dieser Pfad aus der Liste raus. Deswegen ist es mir so wichtig, genau zu erkennen ob es ein Pfad ist oder nicht und dann den Vergleich durchzuführen.
Habt ihr andere Ansätze als den Pfad per RegEx zu erkennen?
(System.IO.Path.IsPathRooted) bringt mich leider nicht weiter, es gibt auch true zurück, wenn der Pfad mit ", 10" endet, wie bei "C:\WINDOWS\system32\mscomct2.ocx, 10".
partyboy
Hallo partyboy,
auch wenn vielleicht für einige eine Welt zusammenbricht, wenn ich das sage. 🙂 Ich würde hier keine Regex verwenden.
Nimm einfach File/Directory.Exists und fang die Exception, wenn das kein gültiger Pfad ist.
Das ist m.E. auch die einzig richtige Vorgehensweise.
herbivore
Hi herbivore,
ich bekomme gar keine Exception, wenn ich per System.IO.File.Exists("C:\WINDOWS\system32\mscomct2.ocx, 10") prüfe. Es wird nur false zurückgeliefert. Wenn ich false zurückbekommen, heißt es fürs Programm, dass der Pfad aus der Liste entfernt werden kann und das wäre fatal.
partyboy
Hallo partyboy,
"C:\WINDOWS\system32\mscomct2.ocx, 10" ist ein gültiger Pfad!
herbivore
Hi herbivore,
das hilft mir aber nicht weiter.
System.IO.File.Exists("C:\WINDOWS\system32\mscomct2.ocx, 10") liefert mir false. Das heißt für mein Programm: Raus mit dem String aus der Liste!
Mein Ziel ist, dass ich alle Strings der Liste überprüfe, ob sie Pfade sind UND auf der Festplatte noch vorhanden sind. Wenn ein String aus der Liste ein Pfad ist und auf der Festplatte NICHT vorhanden ist, dann wird er aus der Liste gelöscht.
Wenns bei mir aber schon daran scheitert, dass ich nicht richtig erkennen kann ob es ein Pfad ist oder nicht, dann werfe ich die falschen Einträge aus der Liste.
Deswegen ist mein Ansatz der, dass ich erstmal versuche zu erkennen ob der String überhaupt ein gültiger Pfad ist. Gültig in dem Sinne, dass ich ihn mit File.Exists bzw. Directory.Exists auf Existens hin überprüfen kann.
Oder gibt es Funktionen mit denen ich soetwas testen kann:
"C:\WINDOWS\system32\mscomct2.ocx, 10"
"C:\WINDOWS\system32\msvbvm60.dll\3"
Besten Gruß,
partyboy
Hallo partyboy,
also nochmal. Du gehst von falschen Voraussetzungen aus.
Sowohl "C:\WINDOWS\system32\mscomct2.ocx, 10" als auch "C:\WINDOWS\system32\msvbvm60.dll\3" sind gültige Pfade. Du kannst Dateien oder Verzeichnisse mit entsprechenden Namen anlegen.
Irgendwie siehst du sie scheinbar aber nicht als gültig an. Also geht es im Zweifel nicht darum, ob es was ein gültiger Pfad ist, sondern ob du ihn als gültig ansiehst. Dann musst du aber erstmal definieren, was du als gültig ansiehst und was nicht. Sonst können wird dir nicht helfen.
herbivore
Hi herbivore,
du hast natürlich völlig recht. Meine Beispiele können durchaus richtige Pfade sein. Ein Ordner kann auch /blabla.dll/ heißen.
Ich hole mir die Pfade aus der Registry und möchte überprüfen ob diese Pfade auf der Festplatte überhaupt existieren. Sollten die Pfade auf der Festplatte nicht existieren, sollen sie aus der Registry gelöscht werde.
Ich kenne nur die Möglichkeiten per File.Exists und Directory.Exists zu überprüfen ob es auf der Festplatte einen Verzeichnis-Pfad bzw. einen Datei-Pfad überhaupt gibt.
Besten Gruß,
partyboy
Hallo partyboy,
vergiss es, das ist zu riskant.
herbivore
Hi herbivore,
deswegen lege ich ja auch viel Wert darauf zu erkennen ob es wirklich ein Pfad ist, den ich mit den .Exists-Funktionen abfragen kann. Vor dem Löschen werden die Werte natürlich gesichert. Ohne Sicherung wäre es selbst mir zu riskant.
Hat jemand noch irgendwelche Vorschläge?
Besten Gruß,
partyboy
Hallo partyboy,
es ist aber syntaktisch nicht zu entscheiden, ob z.B. "C:\WINDOWS\system32\mscomct2.ocx, 10" gültig ist oder nicht, bzw. ist es eben syntaktisch gültig, aber semantisch nicht. Semantik kann man aber Programmen nicht so ohne weiteres beibringen.
Außerdem ist nicht jeder Registry-Eintrag, der einen Pfad enthält, der auf der Festplatte nicht existiert, auch überflüssig.
Ich sehe da keine Chance, aber viel Risiko.
herbivore
Mal diesen thred hervorkramm
ich hab ein ähnliches problem.
ein einem ArrayList() habe ich strings im folgenden format
"test" "c:\test\testsub"
und wolte nun mit regex die beiden in klammer stehenden teile herausbekommen
die " sind weil zb auch stehen kann "test test" "c:\test\testsub"
MfG Paul
Hallo el_panter,
und wolte nun mit regex die beiden in klammer stehenden teile herausbekommen
welche Klammern? Meinst du Anführungsstriche? Dann
""(?<teil1>["]+)" "(?<teil2>["]+)""
(ungetestet)
herbivore
"(?<teil1>["]+)" "(?<teil2>["]+)"
so gehts.
danke. ich wer mich dan ransetzen und meine lästigen split und andern müll wieder rausbauen und das einbauen.
nochmals danke
Edit: ah ne deins ist schon richtig xD
ich hattes jetzt nur mit deinem RegEx -lab geteste und da ging des so natürlich net
MfG Paul
Hallo el_panter,
entweder alle '' raus (für Regex-Lab), oder gar keinen '' raus (für die Verwendung als String-Literal in C#). 🙂
herbivore