Laden...

Prüfen ob ein Pfad angegeben wurde

Erstellt von InSiDeR vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.006 Views
I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren
Prüfen ob ein Pfad angegeben wurde

Hallo zusammen,
ich habe eine Textbox und gebe dort einen Pfad an, wo etwas gespeichert werden soll.

Wie prüfe ich nun, ob wirklich ein Pfad angegeben wurde?
Ob der Pfad existiert, interessiert micht nicht. Möchte einfach nur prüfen, ob wirklich ein Pfad angegeben wurde.

z.b. C:\blabla oder auch D:\Test\Zielort

Kann man da irgendwie etwas konvertieren oder so via try catch?

Danke für eure Hilfe

Mit freundlichen Grüßen,
InSiDeR

P
157 Beiträge seit 2010
vor 12 Jahren

Kann der Pfad auch relative sein?
Ausonsten solltest du Prüfen ob die TextBox leer ist, ob ungültige Zeichen in der Pfadangabe vorhanden sind und ob 2 \ im späteren Pfad hintereinander sind.

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Es geht darum, dass ich bei E-Mail-Anhängen entweder einen UNC-Pfad angebe oder bei der Verschiebung von E-Mails in einen Exchange Unterordner.

Bei meinem Exchange Unterordner kann einfach nur

\Ordner\Ordner\Ordner

stehen.

Bei dem UNC Pfad muss auch kein Laufwerksbuchstabe vorhanden sein. Dort speicher ich den E-Mail Anhang auf einem Netzlaufwerk.

Möchte nur sicher gehen, dass ich auch jeweils Pfade angegeben habe zwecks Fehleeingaben abfangen.

//edit hab mal was ausprobiert:

public static bool IsUNCPath(string input)
        {
            if (input.Trim().StartsWith("\\"+"\\"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

Damit funktioniert es. Netzlaufwerke fangen immer mit "\" an.

Mit freundlichen Grüßen,
InSiDeR

16.834 Beiträge seit 2008
vor 12 Jahren

Nein, prinzipiell dürfen Netzlaufwerke auch mit \?\ bzw \?\UNC\ beginnen. Siehe MSDN: Naming Files, Paths, and Namespaces
Funktionieren aber mit dem IO-Namespace nicht.

Es gibt aber bei einschlägigen Regex-Portalen entsprechende Pattern.
Ein gültiger Pfad eine Share besteht nämlich immer aus \<server>&lt;sharename>

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

Vielen Dank für deine Antwort, Abt.

Daran hab ich garnicht gedacht. Werde mal nachschauen und berichten.

Für meinen UNC Pfad nehme ich:

public static bool IsUNCPath(string input)
        {
            string pattern = @"^(([a-zA-Z]\:)|(\\))(\\{1}|((\\{1})[^\\]([^/:*?<>""|]*))+)$";
            Regex reg = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);

            if (reg.IsMatch(input))
            {
                return true;
            }
            else
            {
                return false;
            }

        }

Funktioniert auch einwandfrei.

Mein normaler Pfad kann aber auch nur ein Backslash vorne enthalten, statt zwingend zwei.

Wenn ich es anpasse auf folgenden:

@"^(([a-zA-Z]\:)|(\))(\{1}|((\{1})[^\\]([^/:*?<>""|]*))+)$";

kommt immer eine Fehlermeldung, dass nicht genügend )-Zeichen vorhanden sind.

Mit freundlichen Grüßen,
InSiDeR

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo InSiDeR,

wenn du in dem Pfad Dateien speichern willst, reicht es nicht sein Format zu prüfen, sondern wenn du sicher gehen willst, dass es funktioniert, musst du einfach versuchen, die Dateien darin zu speichern. Denn es gibt ja viele Gründe, aus denen das Speichern scheitern kann, z.B. dass der Pfad nicht vorhanden ist oder keine Schreibrechte bestehen und dass der Pfad zwischen drin umbenannt wird. Die kann man nicht alle vorab prüfen und selbst wenn man es könnte, kann sich der Zustand sofort danach schon wieder geändert haben. Deshalb versuchen reinschreiben und mögliche Exceptions fangen.

Was dein Regex-Problem angeht: Um auf einen einzelne Backslash zu matchen musst du überall \ schreiben, denn ein \ alleine ist ein Escape-Zeichen für das folgende Zeichen (bei dir unter anderem die schließende Klammer).

Siehe auch On-the-fly Regex-Tester: Regex-Lab

herbivore

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

  
            if (reg.IsMatch(input))  
            {  
                return true;  
            }  
            else  
            {  
                return false;  
            }  
  

s. auch [Tipp] Anfängerfehler == true / == false


            return reg.IsMatch(input);

I
InSiDeR Themenstarter:in
95 Beiträge seit 2011
vor 12 Jahren

@herbivore: Das kann ich vorher leider nicht prüfen. Ich stelle vorher etwas ein, dann wird irgendwann später durchlaufen. In meiner Einstellung kann ich nur prüfen, ob wirklich ein Pfad angegeben wurde.

@ujr: Danke für den Tipp. Hab ich ausgebessert.

//edit: Suche ein Pattern, wo ich einen Pfad prüfe, der so ausschaut:

\Top of Information\Verwaltete Ordner\Verarbeitet\

//edit2: hab folgendes gebastelt:

string pattern = @"(\{1})([\])([^/:?<>""|])$";

und das klappt 😃 doppeltes backslash ist vorne nicht mehr erlaubt.

Mit freundlichen Grüßen,
InSiDeR