net getfilename combine asp c# .net winapi path

combine - path getfilename c#



Verificar si una ruta es vĂ¡lida (10)

Lo más cerca que he llegado es tratando de crearlo, y ver si tiene éxito.

Me pregunto: estoy buscando una forma de validar si un camino determinado es válido. (Nota: ¡No quiero verificar si un archivo existe! Solo quiero probar la validez de la ruta, por lo tanto, si es posible que exista un archivo en la ubicación) .

El problema es que no puedo encontrar nada en la API de .Net. Debido a los muchos formatos y ubicaciones que admite Windows, prefiero usar algo nativo de MS.

Dado que la función debería poder verificar contra:

  • Rutas relativas (./)
  • Rutas absolutas (c: / tmp)
  • UNC-Pathes (/ some-pc / c $)
  • Limitaciones de NTFS como la ruta completa 1024 caracteres: si no me equivoco al exceder la ruta, se hará que un archivo sea inaccesible para muchas funciones internas de Windows. Renombrarlo con Explorer todavía funciona
  • Rutas de GUID de volumen: "/? / Volume {GUID} / somefile.foo

¿Alguien tiene una función como esta?


No he tenido ningún problema con el código a continuación. (Las rutas relativas deben comenzar con ''/'' o ''/').

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; }

Por ejemplo, estos devolverían falso

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);

Y estos regresarían verdaderos:

IsValidPath(@"C://abc"); IsValidPath(@"F:/FILES/"); IsValidPath(@"C://abc.docx//defg.docx"); IsValidPath(@"C:/abc/defg"); IsValidPath(@"C://////////////abc/////////////////defg"); IsValidPath(@"C:/abc/def~`!@#$%^&()_-+={[}];'',.g"); IsValidPath(@"C://///abc////////defg"); IsValidPath(@"/abc", true); IsValidPath(@"/abc", true);



Obtenga los caracteres no válidos de System.IO.Path.GetInvalidPathChars(); y compruebe si su cadena (ruta del directorio) contiene esos o no.


Podría intentar usar Path.IsPathRooted () en combinación con Path.GetInvalidFileNameChars () para asegurarse de que la ruta esté a medio camino.


Puedes probar este código:

try { Path.GetDirectoryName(myPath); } catch { // Path is not valid }

No estoy seguro de que cubra todos los casos ...



Pruebe Uri.IsWellFormedUriString() :

  • La cadena no se escapó correctamente.

    http://www.example.com/path???/file name

  • La cadena es un Uri absoluto que representa un archivo implícito Uri.

    c://directory/filename

  • La cadena es un URI absoluto que falta una barra antes de la ruta.

    file://c:/directory/filename

  • La cadena contiene barras invertidas no guardadas incluso si se tratan como barras diagonales.

    http://host/path/file

  • La cadena representa un Uri absoluto jerárquico y no contiene ": //".

    www.example.com/path/file

  • El analizador del Uri.Scheme indica que la cadena original no estaba bien formada.

    The example depends on the scheme of the URI.


private bool IsValidPath(string path) { Regex driveCheck = new Regex(@"^[a-zA-Z]://$"); if (string.IsNullOrWhiteSpace(path) || path.Length < 3) { return false; } if (!driveCheck.IsMatch(path.Substring(0, 3))) { return false; } var x1 = (path.Substring(3, path.Length - 3)); 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; } var driveLetterWithColonAndSlash = Path.GetPathRoot(path); if (!DriveInfo.GetDrives().Any(x => x.Name == driveLetterWithColonAndSlash)) { return false; } return true; }


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; }