Ich muss überprüfen, ob ein Windows-Ordnername möglicherweise gültig ist. Der Ordner existiert nicht unbedingt schon. Es kann ein absoluter Pfad sein, ein relativer Pfad, oder er kann sich auf einem anderen Rechner im Netzwerk befinden (adressiert über UNC). Regex passenden Ordnernamen lokal (relativ und absolut) und im LAN
Im folgenden gelten Standorte:
[[X:]\] 'Including an empty string.
\\server name\ 'Including \\123.123.123.123\
Beachten Sie, dass Windows nicht akzeptiert /
statt \
als auch (zu überprüfen, geben Sie C:/Users
in den Datei-Explorer).
Die Lage kann durch einen tiefen Weg beschritten werden und muß mit oder ohne abschließenden Schrägstrich in einem Pfadnamen beenden:
[folder name\]*folder name[\]
Keiner der Charaktere /\:*?<>"|
kann in Servernamen oder Ordnernamen angezeigt.
Dies kann durch Vergleich des angegebenen Textes mit einem regulären Ausdruck erfolgen. So habe ich eine solche:
^ 'At the beginning of the string must appear
( 'either
\\{2} '2 backslashes
[^/\\\:\*\?\<\>\|]+ 'followed by a server name
(\\|/) 'and a slash,
| 'or
( 'a sequence of
(\.{2}) '2 dots
(\\|/) 'followed by a slash
)+ 'which may occur at least one time
| 'or
[A-Za-z] 'a drive letter
\: 'followed by a colon
(\\|/) 'and a slash
| 'or
(\\|/) 'simply a slash
)? 'or nothing at all;
( 'followed by a sequence of
[^/\\\:\*\?\<\>\|]+ 'a folder name
(\\|/) 'followed by a slash
)* 'which may occur multiple times
[^/\\\:\*\?\<\>\|]+ 'The last folder needs no final slash
(\\|/)? 'but may have one.
Die folgende Funktion aufgerufen wird:
Private Function IsDirValid(sFile As String) As Boolean
Dim sPattern As String = "^[^/\\\:\*\?\<\>\|]+(\\|/)" &
"|((\.{2})(\\|/))+" &
"|[A-Za-z]\:(\\|/)" &
"|(\\|/)" &
")?" &
"([^/\\\:\*\?\<\>\|]+(\\|/))*" &
"[^/\\\:\*\?\<\>\|]+(\\|/)?"
Dim oMatch As Match = Regex.Match(sFile, sPattern)
'Debug.Print("""" & sFile & """ returns """ & oMatch.Value & """")
Return (sFile = oMatch.Value)
End Function
, die nicht allzu schlecht zu funktionieren scheint. Diese Ausdrücke alle als gültig anerkannt:
path name[/]
path name/path name/path name[/]
/path name[/]
/path name/path name/path name[/]
../../path name[/]
../../path name/path name/path name[/]
c:/path name[/]
c:/path name/path name/path name/file name[/]
\\server name/path name[/]
\\server name\path name\path name\path name[/]
(Habe ich etwas verpasst?)
Mein einziges Problem ist jetzt, dass jeder path name
erlaubt führende und nachfolgende Leerzeichen. Dies ist in Pfadnamen nicht erlaubt. "In-Name" Leerzeichen sind jedoch erlaubt.
Natürlich konnte ich die drei Vorkommen von
[^/\\\:\*\?\<\>\|]+
von
[^/\\\:\*\?\<\>\|\ ][^/\\\:\*\?\<\>\|]*[^/\\\:\*\?\<\>\|\ ]
ersetzen, die das Leerzeichen Problem (getestet) lösen würde, führt aber ein anderes: die Namen auf sein müssen mindestens 2 Zeichen lang (inakzeptabel natürlich). Und es wird hässlich.
Ach, in der regex quick reference guide konnte ich keinen geeigneten Quantifikator für mein Problem finden.
Thence: Gibt es einen prägnanter Weg?
Siehe [Name des Ordners in C# validieren] (https://stackoverflow.com/questions/12688985/validate-folder-name-in-c-sharp), haben Sie versucht ['Path.GetInvalidPathChars (path)'] (https://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars(v=vs.110).aspx)? Und für den UNC-Pfad, [Was ist der richtige Weg zu überprüfen, ob ein Pfad ein UNC-Pfad oder ein lokaler Pfad ist] (https://stackoverflow.com/questions/520753). –
@ WiktorStribiżew: Danke. Vermutet Ihr Vorschlag, 'GetInvalidPathChars' zu verwenden, dass '[^/\\\: \ * \? \ <\> \ | \] [^/\\\: \ * \? \ <\> \ |] + [^/\\ \: \ * \? \ <\> \ | \] 'ist nicht korrekt? Wenn Sie einen Fehler gefunden haben, der die Verwendung dieser Funktion rechtfertigt, lassen Sie es mich bitte wissen. Natürlich ist es kein wirklich elegantes Biest. Ich habe auf einen Quantor irgendeiner Art gehofft, der besagt, "darf nicht mit Whitespace beginnen/enden". Auch eine Art Makro würde helfen. – Herb