649 Stimmen

Welche Zeichen sind in Windows- und Linux-Verzeichnisnamen verboten?

Ich weiß, dass / ist unter Linux verboten, und unter Windows sind die folgenden Dinge verboten (Ich glaube) * . " / \ [ ] : ; | ,

Was fehlt mir noch?

Ich brauche jedoch einen umfassenden Leitfaden, der folgende Punkte berücksichtigt Doppelbyte-Zeichen berücksichtigt. Ein Link zu externen Quellen ist für mich in Ordnung.

Ich muss zunächst ein Verzeichnis im Dateisystem erstellen, dessen Name möglicherweise verbotene Zeichen enthalten kann, weshalb ich plane, diese Zeichen durch Unterstriche ersetzen. Anschließend muss ich dieses Verzeichnis und seinen Inhalt in eine Zip-Datei schreiben schreiben (mit Java), daher wäre ich für jeden zusätzlichen Ratschlag bezüglich der Namen von Zip-Verzeichnissen geschätzt werden.

4voto

gridtrak Punkte 653

Das .NET-Rahmenwerk System.IO bietet die folgenden Funktionen für ungültige Dateisystemzeichen:

Diese Funktionen sollte je nach der Plattform, auf der die .NET-Laufzeitumgebung ausgeführt wird, entsprechende Ergebnisse liefern. Das heißt, die Bemerkungen auf den Dokumentationsseiten für diese Funktionen steht:

Das Array, das von dieser Methode zurückgegeben wird, enthält garantiert nicht die Zeichen, die in Datei- und Verzeichnisnamen ungültig sind, nicht vollständig Namen ungültig sind. Der vollständige Satz der ungültigen Zeichen kann je nach Dateisystem variieren.

4voto

Charlie Rix Punkte 51

Hier ist eine c#-Implementierung für Windows, die auf Christopher Oezbeks Antwort

Es wurde durch den containsFolder-Booleschen Wert komplexer, deckt aber hoffentlich alles ab

/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// https://stackoverflow.com/questions/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
    StringBuilder builder = new StringBuilder(filename.Length + 12);

    int index = 0;

    // Allow colon if it's part of the drive letter
    if (containsFolder)
    {
        Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            builder.Append(match.Value);
            index = match.Length;
        }
    }

    // Character substitutions
    for (int cntr = index; cntr < filename.Length; cntr++)
    {
        char c = filename[cntr];

        switch (c)
        {
            case '\u0000':
            case '\u0001':
            case '\u0002':
            case '\u0003':
            case '\u0004':
            case '\u0005':
            case '\u0006':
            case '\u0007':
            case '\u0008':
            case '\u0009':
            case '\u000A':
            case '\u000B':
            case '\u000C':
            case '\u000D':
            case '\u000E':
            case '\u000F':
            case '\u0010':
            case '\u0011':
            case '\u0012':
            case '\u0013':
            case '\u0014':
            case '\u0015':
            case '\u0016':
            case '\u0017':
            case '\u0018':
            case '\u0019':
            case '\u001A':
            case '\u001B':
            case '\u001C':
            case '\u001D':
            case '\u001E':
            case '\u001F':

            case '<':
            case '>':
            case ':':
            case '"':
            case '/':
            case '|':
            case '?':
            case '*':
                builder.Append('_');
                break;

            case '\\':
                builder.Append(containsFolder ? c : '_');
                break;

            default:
                builder.Append(c);
                break;
        }
    }

    string built = builder.ToString();

    if (built == "")
    {
        return "_";
    }

    if (built.EndsWith(" ") || built.EndsWith("."))
    {
        built = built.Substring(0, built.Length - 1) + "_";
    }

    // These are reserved names, in either the folder or file name, but they are fine if following a dot
    // CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
    builder = new StringBuilder(built.Length + 12);
    index = 0;
    foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
    {
        Group group = match.Groups["bad"];
        if (group.Index > index)
        {
            builder.Append(built.Substring(index, match.Index - index + 1));
        }

        builder.Append(group.Value);
        builder.Append("_");        // putting an underscore after this keyword is enough to make it acceptable

        index = group.Index + group.Length;
    }

    if (index == 0)
    {
        return built;
    }

    if (index < built.Length - 1)
    {
        builder.Append(built.Substring(index));
    }

    return builder.ToString();
}

3voto

Dogg Bookins Punkte 49

Obwohl die einzigen illegalen Unix-Zeichen sein könnten / y NULL obwohl einige Überlegungen zur Interpretation der Befehlszeile angestellt werden sollten.

So kann es zum Beispiel legal sein, eine Datei wie folgt zu benennen 1>&2 o 2>&1 unter Unix können solche Dateinamen falsch interpretiert werden, wenn sie in einer Befehlszeile verwendet werden.

In ähnlicher Weise wäre es möglich, eine Datei zu benennen $PATH , aber wenn man versucht, von der Kommandozeile aus darauf zuzugreifen, übersetzt die Shell $PATH auf seinen variablen Wert.

3voto

Wally Brockway Punkte 11

Ich habe immer angenommen, dass verbotene Zeichen in Windows-Dateinamen bedeuten, dass alle exotischen Zeichen ebenfalls verboten sind. Die Unmöglichkeit der Verwendung von ? , / y : hat mich besonders geärgert. Eines Tages entdeckte ich, dass es praktisch nur diese Zeichen waren, die verboten wurden. Andere Unicode-Zeichen können verwendet werden. Also wurden die Unicode-Zeichen, die den verbotenen Zeichen am nächsten kamen, identifiziert und MS-Word-Makros für sie erstellt als Alt + ? , Alt + : usw. Nun formuliere ich den Dateinamen in Word unter Verwendung der Ersatzzeichen und kopiere ihn in den Windows-Dateinamen. Bis jetzt hatte ich keine Probleme.

Hier sind die Ersatzzeichen ( Alt + der dezimale Unicode) :

  • Alt 8432
  • Alt 8260
  • Alt 8421
  • Alt 8739
  • Alt 11622
  • Alt 11162
  • Alt 8253
  • Alt 4961
  • Alt 8246
  • Alt 8243

Als Test habe ich einen Dateinamen mit all diesen Zeichen gebildet und Windows hat ihn akzeptiert.

1voto

Cees Timmerman Punkte 15076

Das ist für mich in Python gut genug:

def fix_filename(name, max_length=255):
    """
    Replace invalid characters on Linux/Windows/MacOS with underscores.
    List from https://stackoverflow.com/a/31976060/819417
    Trailing spaces & periods are ignored on Windows.
    >>> fix_filename("  COM1  ")
    '_ COM1 _'
    >>> fix_filename("COM10")
    'COM10'
    >>> fix_filename("COM1,")
    'COM1,'
    >>> fix_filename("COM1.txt")
    '_.txt'
    >>> all('_' == fix_filename(chr(i)) for i in list(range(32)))
    True
    """
    return re.sub(r'[/\\:|<>"?*\0-\x1f]|^(AUX|COM[1-9]|CON|LPT[1-9]|NUL|PRN)(?![^.])|^\s|[\s.]$', "_", name[:max_length], flags=re.IGNORECASE)

Siehe auch diese überholte Liste für zusätzliche Altlasten wie = in FAT32.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X