Laden...

RegEx für gültige Pfade

Erstellt von partyboy vor 18 Jahren Letzter Beitrag vor 16 Jahren 21.637 Views
P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren
RegEx für gültige Pfade

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

4.207 Beiträge seit 2003
vor 18 Jahren

Was ist denn an C:\WINDOWS\system32\msvbvm60.dll\3 ungültig?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

P
939 Beiträge seit 2003
vor 18 Jahren

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

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo partyboy,

"C:\WINDOWS\system32\mscomct2.ocx, 10" ist ein gültiger Pfad!

herbivore

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo partyboy,

vergiss es, das ist zu riskant.

herbivore

P
partyboy Themenstarter:in
109 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

E
395 Beiträge seit 2007
vor 16 Jahren

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

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo el_panter,

und wolte nun mit regex die beiden in klammer stehenden teile herausbekommen

welche Klammern? Meinst du Anführungsstriche? Dann

"&quot;(?<teil1>[&quot;]+)&quot; &quot;(?<teil2>[&quot;]+)&quot;"

(ungetestet)

herbivore

E
395 Beiträge seit 2007
vor 16 Jahren

"(?<teil1>[&quot;]+)" "(?<teil2>[&quot;]+)"

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

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo el_panter,

entweder alle '&#39; raus (für Regex-Lab), oder gar keinen '&#39; raus (für die Verwendung als String-Literal in C#). 🙂

herbivore