Laden...

Ist String s ein gültiger Filename?

Erstellt von juetho vor 17 Jahren Letzter Beitrag vor 8 Jahren 4.462 Views
J
juetho Themenstarter:in
3.331 Beiträge seit 2006
vor 17 Jahren
Ist String s ein gültiger Filename?

Nanu, diese Frage wurde noch nicht behandelt? Die Suche nach "Filename AND valid" sowie "Filename AND gültig" hat mir jedenfalls keine Antwort geliefert.

Unter NET 2.0 gibt es die StringValidator-Klasse, die eine Minimalprüfung durchführt. Und unter NET 1.1?

Mein Problem: Ich habe einen String, der (in der Regel) Pfad, Dateiname und Extension enthält; mit diesem String als Filename möchte ich eine Datei (hier: ImageFormat) speichern. Ich möchte vor dem Speichern wissen, ob dieser String gültig ist, da auch die IOExceptions nicht unbedingt eine passende Auskunft geben. (Die Datei kann schon vorhanden sein und darf ohne Rückfrage überschrieben werden; aber sie kann auch erstmals erzeugt werden.)

Welche einfache Lösung habe ich übersehen? Danke! Jürgen

PS. Ansonsten schonmal frohes Neues Jahr!

484 Beiträge seit 2006
vor 17 Jahren

Die Gültigkeit des Strings kannst Du mit RegEx überprüfen.

Feststellen ob eine Datei bereits existiert, geht mit System.IO.FileInfo
FileExists

Wenn Du den Pfad überprüfen möchtest, nimm System.IO.DirectoryInfo
DirectoryExists

Gruß Jörg

J
juetho Themenstarter:in
3.331 Beiträge seit 2006
vor 17 Jahren

Sorry, FileExists() und DirectoryExists() kenne ich (natürlich). Mit RegEx habe ich mich noch nicht befasst (es gibt zu viele andere Teilthemen).

Ich hatte gehofft/erwartet, es gibt "irgendwo" eine fertige Methode. Jürgen

484 Beiträge seit 2006
vor 17 Jahren

Die StringValidator-Klasse aus 2.0 ist ja kein Hexenwerk, geh mal mit Reflector ran und du siehst das es ganz simpel aufgebaut ist.

Unter http://regexlib.com/ wirst Du bestimmt ein passendes Pattern finden.

Jörg

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo juetho,

die einzig zuverlässige Prüfung auf Gültigkeit, ist m.E. den Pfad zu verwenden und zu gucken, ob man keine Exception bekommt. Eine syntaktische Prüfung reicht m.E. nicht, dazu gibt es zuviele unterschiedliche Varianten (UNC, Laufwerksbuchstabe, absolut, relativ, ...) und zuviele unterschiedliche Dateisysteme (FAT, FAT32, NTFS sowie diverse nicht-Windows-Dateisysteme).

herbivore

J
juetho Themenstarter:in
3.331 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
die einzig zuverlässige Prüfung auf Gültigkeit, ist m.E. den Pfad zu verwenden und zu gucken, ob man keine Exception bekommt. Eine syntaktische Prüfung reicht m.E. nicht...

Na gut, dann beschränke ich mich auf diese "nachträgliche" Prüfung. (Für mich selbst könnte ich mit Einschränkungen leben; aber die Klasse, in der ich es einbaue, soll allgemein verwendet werden.)

Nochmals alles Gute und danke! Jürgen

420 Beiträge seit 2007
vor 16 Jahren

Wenn du nur unter Windows arbeitest...


public static bool IsValidPath(string path)
        {
            char[] invalidChars = { '/', ':', '*', '?', '>', '<', '>', '|' };
            int countInvalidChars = path.IndexOfAny(invalidChars, 3);
            
            bool foundValidRootDir = false;
            DriveInfo[] roots = DriveInfo.GetDrives();
            
            foreach (DriveInfo root in roots)
            {
                if (path[0].ToString().ToLower() == root.ToString()[0].ToString().ToLower())
                {
                    foundValidRootDir = true;
                    break;
                }
            }

            if ((countInvalidChars == -1) && (foundValidRootDir) && (path[1].ToString() + path[2].ToString() == @":\"))
                return true;
            else
                return false;
        }

Gruß Dennis

2.921 Beiträge seit 2005
vor 8 Jahren

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace PTC_FDA_Report_GUI
{
    public delegate void VerifyEventHandler(object sender, VerifyEventArgs e);

    public class VerifyEventArgs : EventArgs
    {
        private string m_sText = string.Empty;

        public VerifyEventArgs(string _sOutput)
        {
            m_sText = _sOutput;
        }

        public string Text
        {
            get { return m_sText; }
            private set { m_sText = value; }
        }
    }

    public class Verify
    {   
        public event VerifyEventHandler VerifyEvent;

        public bool IsValidFileName(string _sFileName)
        {
            //Check Path
            string sPath = string.Empty;

            bool bResult = true;
            try
            {
                char[] chInvalidPathChars = Path.GetInvalidPathChars();
                sPath = Path.GetDirectoryName(_sFileName);
                if (sPath == null)
                {
                    bResult &= false;
                }
                else if (sPath.IndexOfAny(chInvalidPathChars) > 0)
                {
                    bResult &= false;
                }
                else
                {
                    bResult &= true;
                }
                if (!Directory.Exists(sPath))
                {
                    OnVerify(new VerifyEventArgs(string.Format("Path {0} does not exist", sPath)));
                    bResult &= false;
                }
            }
            catch(ArgumentException ex)
            {
                OnVerify(new VerifyEventArgs(ex.Message));
                bResult &= false;
            }
            catch(Exception ex)
            {
                OnVerify(new VerifyEventArgs(ex.Message));
                bResult &= false;
            }

            //Check Filename
            string sFileName = string.Empty;

            try
            {
                char[] chInvalidFileNameChars = Path.GetInvalidFileNameChars();
                sFileName = Path.GetFileName(_sFileName);

                chInvalidFileNameChars = Path.GetInvalidFileNameChars();
                if (sFileName.IndexOfAny(chInvalidFileNameChars) > 0) bResult &= false;
                bResult &= true;
            }
            catch(Exception ex)
            {
                OnVerify(new VerifyEventArgs(ex.Message));
                bResult &= false;
            }
            return bResult;
        }
      
        public bool IsValidFilter()
        {
            return false;
        }

        public bool IsValidConfig()
        {
            return false;
        }

        protected void OnVerify(VerifyEventArgs e)
        {
            if (this.VerifyEvent != null)
            {
                this.VerifyEvent(this, e);
            }
        }
    }
}

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

49.485 Beiträge seit 2005
vor 8 Jahren

Hallo dr4g0n76,

du solltest noch erwähnen (bzw. tue ich das jetzt einfach 😃, dass die Prüfung voraussetzt, dass der Verzeichnis-Anteil des Pfades existiert. Das passt zwar genau zu der Anforderung im Startbeitrag, sagt aber nicht, ob der Pfad für sich genommen (syntaktisch) gültig wäre, auch wenn das Verzeichnis nicht existiert.

Andersherum überprüfst du nicht auf etwaige Begrenzungen der Pfadlänge. Wenn der Dateiname zu lang ist, könnte der Pfad insgesamt ungültig sein, selbst wenn das Verzeichnis existiert und der Dateiname nur aus gültigen Zeichen besteht.

Und selbst wenn der Pfad an sich (syntaktisch) gültig wäre (und das Verzeichnis existiert), könnte es trotzdem sein, dass man in dem Verzeichnis aufgrund der Zugriffsrechte keine Datei anlegen darf. Es ist halt immer die Frage, was man unter "gültig" versteht. Letztlich kommt es dem Thread-Starter ja wohl darauf an, dass er den Pfad tatsächlich zum Speichern einer Datei verwenden kann. Dafür ist auf jeden Fall relevant, ob die nötigen Zugriffsrechte vorhanden sind. Und darüber hinaus z.B. auch darauf, ob auf der Platte noch genügend freie Kapazität vorhanden ist. Und evtl. noch, ob auch die Datei selbst existiert oder gerade nicht existiert.

Letztlich bleibe ich bei meiner Aussage von oben: Die einzige verlässliche Prüfung ist den Pfad für die anstehende Aufgabe (z.B. das Anlegen einer Datei) zu verwenden und dabei etwaige Exceptions abzufangen. Nur so werden alle Spezialitäten und Eventualitäten berücksichtigt.

herbivore