ruta obtener nombre net getfilename extension directorio con asp archivos archivo c# string uri filenames

net - Obtener el nombre de archivo de la cadena URI en C#



obtener ruta de archivo con openfiledialog c# (7)

Tengo este método para tomar el nombre de archivo de un URI de cadena. ¿Qué puedo hacer para que sea más robusto?

private string GetFileName(string hrefLink) { string[] parts = hrefLink.Split(''/''); string fileName = ""; if (parts.Length > 0) fileName = parts[parts.Length - 1]; else fileName = hrefLink; return fileName; }


Creo que esto hará lo que necesitas:

var uri = new Uri(hreflink); var filename = uri.Segments.Last();


La mayoría de las respuestas son incompletas o no se ocupan de las cosas que vienen después de la ruta (cadena de consulta / hash).

readonly static Uri SomeBaseUri = new Uri("http://canbeanything"); static string GetFileNameFromUrl(string url) { Uri uri; if (!Uri.TryCreate(url, UriKind.Absolute, out uri)) uri = new Uri(SomeBaseUri, url); return Path.GetFileName(uri.LocalPath); }

Resultados de la prueba:

GetFileNameFromUrl(""); // "" GetFileNameFromUrl("test"); // "test.xml" GetFileNameFromUrl("test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1"); // "test.xml" GetFileNameFromUrl("/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3"); // "test.xml" GetFileNameFromUrl("http://www.a.com/test.xml?q=1&x=3#aidjsf"); // "test.xml" GetFileNameFromUrl("http://www.a.com/a/b/c/d"); // "d" GetFileNameFromUrl("http://www.a.com/a/b/c/d/e/"); // ""


La respuesta aceptada es problemática para http urls. Además, Uri.LocalPath realiza conversiones específicas de Windows y, como alguien señaló, deja cadenas de consulta allí. Una mejor forma es usar Uri.AbsolutePath

La forma correcta de hacer esto para http urls es:

Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.AbsolutePath);


Puede hacer un objeto System.Uri y usar IsFile para verificar que sea un archivo, luego Uri.LocalPath para extraer el nombre del archivo.

Esto es mucho más seguro, ya que también le proporciona un medio para verificar la validez del URI.

Edite en respuesta al comentario:

Para obtener solo el nombre de archivo completo, usaría:

Uri uri = new Uri(hreflink); if (uri.IsFile) { string filename = System.IO.Path.GetFileName(uri.LocalPath); }

Esto hace todo el control de errores para usted, y es neutral en la plataforma. Todos los casos especiales se manejan de manera rápida y fácil.


Uri.IsFile no funciona con http urls. Solo funciona para "file: //". Desde MSDN : "La propiedad IsFile es verdadera cuando la propiedad Scheme es igual a UriSchemeFile". Entonces no puedes depender de eso.

Uri uri = new Uri(hreflink); string filename = System.IO.Path.GetFileName(uri.LocalPath);


esta es mi muestra que puedes usar:

public static string GetFileNameValidChar(string fileName) { foreach (var item in System.IO.Path.GetInvalidFileNameChars()) { fileName = fileName.Replace(item.ToString(), ""); } return fileName; } public static string GetFileNameFromUrl(string url) { string fileName = ""; if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) { fileName = GetFileNameValidChar(Path.GetFileName(uri.AbsolutePath)); } string ext = ""; if (!string.IsNullOrEmpty(fileName)) { ext = Path.GetExtension(fileName); if (string.IsNullOrEmpty(ext)) ext = ".html"; else ext = ""; return GetFileNameValidChar(fileName + ext); } fileName = Path.GetFileName(url); if (string.IsNullOrEmpty(fileName)) { fileName = "noName"; } ext = Path.GetExtension(fileName); if (string.IsNullOrEmpty(ext)) ext = ".html"; else ext = ""; fileName = fileName + ext; if (!fileName.StartsWith("?")) fileName = fileName.Split(''?'').FirstOrDefault(); fileName = fileName.Split(''&'').LastOrDefault().Split(''='').LastOrDefault(); return GetFileNameValidChar(fileName); }

Uso:

var fileName = GetFileNameFromUrl("http://cdn.p30download.com/?b=p30dl-software&f=Mozilla.Firefox.v58.0.x86_p30download.com.zip");


using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(hrefLink.Replace("/", "//")); }

Esto supone, por supuesto, que has analizado el nombre del archivo.

EDIT # 2:

using System.IO; private String GetFileName(String hrefLink) { return Path.GetFileName(Uri.UnescapeDataString(hrefLink).Replace("/", "//")); }

Esto debería manejar espacios y similares en el nombre del archivo.