C # Sanitize Dateiname

Ich vor kurzem haben sich ein Haufen MP3s von verschiedenen Standorten in ein repository. Ich hatte schon den Bau der neuen Dateinamen aus den ID3-tags (danke, TagLib-Sharp!), und ich bemerkte, dass ich immer ein System.NotSupportedException:

"Der angegebene Pfad das format wird nicht unterstützt."

Diese wurde erzeugt, indem entweder File.Copy() oder Directory.CreateDirectory().

Dauerte es nicht lange, zu erkennen, dass meine Datei-Namen benötigt werden saniert. Also Tat ich das naheliegende getan:

public static string SanitizePath_(string path, char replaceChar)
{
    string dir = Path.GetDirectoryName(path);
    foreach (char c in Path.GetInvalidPathChars())
        dir = dir.Replace(c, replaceChar);

    string name = Path.GetFileName(path);
    foreach (char c in Path.GetInvalidFileNameChars())
        name = name.Replace(c, replaceChar);

    return dir + name;
}

Zu meiner überraschung, fuhr ich Fort, um Ausnahmen. Es stellte sich heraus, dass ':' ist nicht in der Menge der Path.GetInvalidPathChars()weil es ist gültig in einem Pfad root. Ich nehme an, das macht Sinn - aber das ist ein ziemlich verbreitetes problem. Hat jemand ein paar kurzen code, desinfiziert Pfad? Die gründlichste, die ich mir ausgedacht habe, aber es fühlt sich an wie es ist wahrscheinlich übertrieben.

    //replaces invalid characters with replaceChar
    public static string SanitizePath(string path, char replaceChar)
    {
        //construct a list of characters that can't show up in filenames.
        //need to do this because ":" is not in InvalidPathChars
        if (_BadChars == null)
        {
            _BadChars = new List<char>(Path.GetInvalidFileNameChars());
            _BadChars.AddRange(Path.GetInvalidPathChars());
            _BadChars = Utility.GetUnique<char>(_BadChars);
        }

        //remove root
        string root = Path.GetPathRoot(path);
        path = path.Remove(0, root.Length);

        //split on the directory separator character. Need to do this
        //because the separator is not valid in a filename.
        List<string> parts = new List<string>(path.Split(new char[]{Path.DirectorySeparatorChar}));

        //check each part to make sure it is valid.
        for (int i = 0; i < parts.Count; i++)
        {
            string part = parts[i];
            foreach (char c in _BadChars)
            {
                part = part.Replace(c, replaceChar);
            }
            parts[i] = part;
        }

        return root + Utility.Join(parts, Path.DirectorySeparatorChar.ToString());
    }

Alle Verbesserungen, um diese Funktion schneller und weniger Barock wäre sehr geschätzt werden.

InformationsquelleAutor der Frage Jason Sundram | 2008-11-21

Schreibe einen Kommentar