myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » RegEx für gültige Pfade
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

RegEx für gültige Pfade

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109


partyboy ist offline

RegEx für gültige Pfade

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

Code:
1:
^[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
08.01.2006 17:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Golo Roden Golo Roden ist männlich
myCSharp.de-Mitglied

avatar-2167.png


Dabei seit: 04.10.2003
Beiträge: 4.207
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Riegel am Kaiserstuhl


Golo Roden ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Was ist denn an C:\WINDOWS\system32\msvbvm60.dll\3 ungültig?
08.01.2006 18:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Pulpapex Pulpapex ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.07.2003
Beiträge: 939
Entwicklungsumgebung: Eclipse / VC# 2005
Herkunft: Rostock


Pulpapex ist offline Füge Pulpapex Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 18:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109

Themenstarter Thema begonnen von partyboy

partyboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 19:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 20:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109

Themenstarter Thema begonnen von partyboy

partyboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 21:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo partyboy,

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

herbivore
08.01.2006 21:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109

Themenstarter Thema begonnen von partyboy

partyboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 21:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 21:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109

Themenstarter Thema begonnen von partyboy

partyboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 22:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo partyboy,

vergiss es, das ist zu riskant.

herbivore
08.01.2006 22:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
partyboy
myCSharp.de-Mitglied

Dabei seit: 18.07.2005
Beiträge: 109

Themenstarter Thema begonnen von partyboy

partyboy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 22:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
08.01.2006 22:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
el_panter el_panter ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.09.2007
Beiträge: 395
Entwicklungsumgebung: C# 2010 ultimate
Herkunft: Sömmerda


el_panter ist offline MSN-Passport-Profil von el_panter anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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"
27.09.2007 12:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo el_panter,

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

welche Klammern? Meinst du Anführungsstriche? Dann

"\"(?<teil1>[^\"]+)\" \"(?<teil2>[^\"]+)\""

(ungetestet)

herbivore
27.09.2007 14:08 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
el_panter el_panter ist männlich
myCSharp.de-Mitglied

Dabei seit: 05.09.2007
Beiträge: 395
Entwicklungsumgebung: C# 2010 ultimate
Herkunft: Sömmerda


el_panter ist offline MSN-Passport-Profil von el_panter anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

"(?<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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von el_panter am 27.09.2007 14:22.

27.09.2007 14:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.475
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo el_panter,

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

herbivore
27.09.2007 14:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 14 Jahre.
Der letzte Beitrag ist älter als 12 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 05.06.2020 05:12