Feedback

C# - Pfad überprüfen (Viele Funktionen) ;)

Veröffentlicht von am 7/5/2013
(0 Bewertungen)
Über die Nützlichkeit und vor allen Dingen die Häufigkeit der Nutzung dieses Snippets lässt sich wohl streiten.
Trotzdem ist es viel Arbeit, wenn man so eine Methode braucht, weswegen ich sie hier mit euch teilen möchte.

Sie prüft nicht ob der Pfad existiert, aber ob er gültig ist. Das Besondere ist eine Funktion, die ich persönlich Benutze, da ich einige Matches festgelegt habe für Umgebungs-Variablen ('[x]'). Diese Übergebe ich. Außerdem setzt die Methode einen String, der die Zulässigkeit des Pfades begründet.
List<string> EnvironmentTags = new List<string>();
EnvironmentTags.Add("[desktop]");
EnvironmentTags.Add("[appdata]");
string reason;
if(!ValidPath("[kartoffelbrei]\test", out reason, EnvironmentTags))
MessageBox.Show(reason);

// MessageBox-Text: [kartoffelbrei] ist keine gültige Umgebungsvariable.
// %Liste der erlaubten Umgebungs-Variablen%


Ungültig sind:
* Alle Pfade ohne Root (->Relative Pfade)
* Alle Pfade mit ungültigen Umgebungsvariablen(-> nicht in Liste enthalten) - Ausnahme: Wenn bereits eine gültige Umgebungsvariable vorkam
* Alle Pfade mit mehreren Umgebungsvariablen
* Alle Pfade, bei denen die Umgebungsvariable nicht am Anfang steht
* Alle Pfade, die "Illegale" Zeichen enthalten

Damit ist "[kartoffelbrei]\[desktop]" ungültig, aber "[desktop]\[kartoffelbrei]" gültig.

Wer lieber auch die in Windows verwendeten %-Zeichen nutzen möchte kann diese ja einfach ersetzen oder ein weiteren Parameter einführen ;)

Die Methode wandelt die Umgebungsvariablen nicht in ihre Entsprechungen.
Empfehlung dafür: http://dotnet-snippets.de/snippet/replace-mit-dictionary/1711


Das Snippet benutzt die Hilfsmethoden:
* GetLowest
* FirstIndexOfOneOfStrings
(Beide von mir)
        public static bool ValidPath(string Path, out string ReasonReport, List<string> environmentVariables)
        {
            foreach (char c in System.IO.Path.GetInvalidPathChars())
            {
                if (Path.Contains(c))
                {
                    ReasonReport = "Der Pfad enthält ungültige Zeichen wie '" + c + "'.";
                    return false;
                }
            }

            if (Path.Trim() == "")
            {
                ReasonReport = "Der Pfad ist leer.";
                return false;
            }

            if (Path.Contains("[") & Path.Contains("]"))
            {
                string supportedEVariables = "";
                foreach (string s in environmentVariables)
                    supportedEVariables += "\n  " + s;

                int variables = CountAppereance(Path, environmentVariables);
                if (variables == 1)
                {
                    try
                    {
                        string InvalidPattern = Path.Split('[')[1];
                        InvalidPattern = "[" + InvalidPattern.Split(']')[0] + "]";
                        if (Path.IndexOf(InvalidPattern) < FirstIndexOfOneOfStrings(Path, environmentVariables))
                        {
                            ReasonReport = InvalidPattern + " ist keine gültige Umgebungsvariable.\nUnterstützt werden:" + supportedEVariables;
                            return false;
                        }
                    }
                    catch
                    {
                    }
                    ReasonReport = "Der Pfad ist korrekt.";
                    return true;
                }
                else if (variables == 0)
                {
                    string InvalidPattern = Path.Split('[')[1];
                    InvalidPattern = InvalidPattern.Split(']')[0];
                    ReasonReport = "[" + InvalidPattern + "] ist keine gültige Umgebungsvariable.\nUnterstützt werden:" + supportedEVariables;
                    return false;
                }
                else if (variables > 1)
                {
                    ReasonReport = "Der Pfad enthält mehrere gültige Umgebungsvariablen.";
                    return false;
                }
                else
                {
                    ReasonReport = "Beim Prüfen des Pfades ist ein Fehler aufgetreten. Bitte geben Sie den Pfad erneut ein.";
                    return false;
                }
            }
            else if (System.IO.Path.GetPathRoot(Path) == "")
            {
                ReasonReport = Path + " existiert nicht.";
                return false;
            }
            else
            {
                ReasonReport = "Der Pfad ist korrekt.";
                return true;
            }
        }


        public static int FirstIndexOfOneOfStrings(string input, List<string> indexof)
        {
            List<int> values = new List<int>();
            foreach (string s in indexof)
            {
                if (input.Contains(s))
                    values.Add(input.IndexOf(s));
            }
            return GetLowest(values);
        }

        private static int GetLowest (List<int> integers)
        {
            int[] iArray = integers.ToArray();
            Array.Sort(iArray);
            return iArray[0];
        }

1 Kommentare zum Snippet

dariusarnold schrieb am 7/5/2013:
Mit letzterer Anmerkung möchte ich keines Wegs irgendwelche Urheberrechte erheben oder so (falls es so klingt) - dann wäre ich hier fehl am Platze -, sondern nur ausdrücken, dass sie nicht gegen Urheberrechte dritter verstößt. ;)

Ihr findet die erste der beiden Hilfsmethoden dementsprechend auch hier: http://dotnet-snippets.de/snippet/1-vorkommen-eines-belbg-strings-aus-einer-list-in-einem-anderen/1743
 

Logge dich ein, um hier zu kommentieren!