Ich frage mich nur: Ich suche nach einem Weg, um zu überprüfen, ob ein angegebener Pfad gültig ist .(Hinweis: Ich möchte nicht prüfen, ob eine Datei vorhanden ist!) Pfad - Wenn also möglicherweise eine Datei am Speicherort vorhanden ist).
Das Problem ist, dass ich nichts in der .NET-API finden kann. Aufgrund der vielen von Windows unterstützten Formate und Speicherorte möchte ich lieber etwas MS-natives verwenden.
Da sollte die Funktion gegen prüfen können:
- Relative Pfade (./)
- Absolute Pfade (c:\tmp)
- UNC-Pfade (\ some-pc\c $)
- NTFS-Einschränkungen wie der vollständige Pfad 1024 Zeichen - Wenn ich mich nicht irre, wenn Sie den Pfad überschreiten, wird eine Datei für viele nicht zugänglich interne Windows-Funktionen. Das Umbenennen mit dem Explorer funktioniert immer noch
- Volume GUID Pfade: "\?\Volume {GUID}\somefile.foo
Hat jemand eine Funktion wie diese?
Versuchen Sie Uri.IsWellFormedUriString()
:
Die Zeichenfolge wird nicht korrekt mit Escapezeichen versehen.
http://www.example.com/path???/file name
Die Zeichenfolge ist ein absoluter Uri, der eine implizite Datei Uri darstellt.
c:\\directory\filename
Die Zeichenfolge ist ein absoluter URI, dem ein Schrägstrich vor dem Pfad fehlt.
file://c:/directory/filename
Die Zeichenfolge enthält unverschobene Backslashes, auch wenn sie als Schrägstrich behandelt werden.
http:\\Host/path/file
Die Zeichenfolge stellt einen hierarchischen absoluten Uri dar und enthält kein ": //".
www.example.com/path/file
Der Parser für das Uri.Scheme zeigt an, dass die ursprüngliche Zeichenfolge nicht ordnungsgemäß geformt wurde.
The example depends on the scheme of the URI.
Oder verwenden Sie die FileInfo wie in vorgeschlagen. Überprüfen Sie in C #, ob Dateiname möglicherweise gültig ist (nicht existiert) .
private bool IsValidPath(string path)
{
Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;
string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars());
strTheseAreInvalidFileNameChars += @":/?*" + "\"";
Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]");
if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
return false;
DirectoryInfo dir = new DirectoryInfo(Path.GetFullPath(path));
if (!dir.Exists)
dir.Create();
return true;
}
Ich habe keine Probleme mit dem Code unten. (Relative Pfade müssen mit '/' oder '\' beginnen).
private bool IsValidPath(string path, bool allowRelativePaths = false)
{
bool isValid = true;
try
{
string fullPath = Path.GetFullPath(path);
if (allowRelativePaths)
{
isValid = Path.IsPathRooted(path);
}
else
{
string root = Path.GetPathRoot(path);
isValid = string.IsNullOrEmpty(root.Trim(new char[] { '\\', '/' })) == false;
}
}
catch(Exception ex)
{
isValid = false;
}
return isValid;
}
Zum Beispiel würden diese falsch zurückgeben:
IsValidPath("C:/abc*d");
IsValidPath("C:/abc?d");
IsValidPath("C:/abc\"d");
IsValidPath("C:/abc<d");
IsValidPath("C:/abc>d");
IsValidPath("C:/abc|d");
IsValidPath("C:/abc:d");
IsValidPath("");
IsValidPath("./abc");
IsValidPath("./abc", true);
IsValidPath("/abc");
IsValidPath("abc");
IsValidPath("abc", true);
Und diese würden wahr zurückkehren:
IsValidPath(@"C:\\abc");
IsValidPath(@"F:\FILES\");
IsValidPath(@"C:\\abc.docx\\defg.docx");
IsValidPath(@"C:/abc/defg");
IsValidPath(@"C:\\\//\/\\/\\\/abc/\/\/\/\///\\\//\defg");
IsValidPath(@"C:/abc/def~`[email protected]#$%^&()_-+={[}];',.g");
IsValidPath(@"C:\\\\\abc////////defg");
IsValidPath(@"/abc", true);
IsValidPath(@"\abc", true);
Sie können diesen Code ausprobieren:
try
{
Path.GetDirectoryName(myPath);
}
catch
{
// Path is not valid
}
Ich bin mir nicht sicher, ob es alle Fälle abdeckt ...
Am nächsten bin ich gekommen, indem ich versuche, es zu schaffen und zu sehen, ob es gelingt.
Rufen Sie die ungültigen Zeichen von System.IO.Path.GetInvalidPathChars();
ab und prüfen Sie, ob Ihre Zeichenfolge (Verzeichnispfad) diese enthält oder nicht.
Es gibt viele gute Lösungen hier, aber da keine von diesen Optionen vorhanden ist, überprüfen Sie, ob der Pfad in einem bestehenden Laufwerk verankert ist. Hier ist noch eines:
private bool IsValidPath(string path)
{
// Check if the path is rooted in a driver
if (path.Length < 3) return false;
Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;
// Check if such driver exists
IEnumerable<string> allMachineDrivers = DriveInfo.GetDrives().Select(drive => drive.Name);
if (!allMachineDrivers.Contains(path.Substring(0, 3))) return false;
// Check if the rest of the path is valid
string InvalidFileNameChars = new string(Path.GetInvalidPathChars());
InvalidFileNameChars += @":/?*" + "\"";
Regex containsABadCharacter = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]");
if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
return false;
if (path[path.Length - 1] == '.') return false;
return true;
}
Diese Lösung berücksichtigt nicht relative Pfade.