Saltar al contenido

Obtener extensión de archivo o tipo “HasExtension” bool del objeto Uri C#

Si hallas algún fallo con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

Puedes usar el HasExtension metodo de la System.IO.Path clase para determinar si un Uri string tiene una extensión.

Al usar el AbsoluteUri propiedad de la Uri objeto, puede recuperar el completo string que representa el Uri. pasando esto string a la clase Path HasExtension devolverá correctamente un valor booleano que indica si el Uri contiene una extensión de archivo.

Copie y pegue el siguiente código en una aplicación de consola simple para probar esto. Solamente myUri3 y myUrl4 return True, que también demuestra que el HasExtension El método puede manejar correctamente caracteres adicionales (es decir, cadenas de consulta) después del nombre del archivo (y la extensión).

using System;
using System.IO;
namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            Uri myURI1 = new Uri(@"http://www.somesite.com/");
            Uri myURI2 = new Uri(@"http://www.somesite.com/filenoext");
            Uri myURI3 = new Uri(@"http://www.somesite.com/filewithext.jpg");
            Uri myURI4 = new Uri(@"http://www.somesite.com/filewithext.jpg?q=randomquerystring");

            Console.WriteLine("Does myURI1 have an extension: " + Path.HasExtension(myURI1.AbsoluteUri));
            Console.WriteLine("Does myURI2 have an extension: " + Path.HasExtension(myURI2.AbsoluteUri));
            Console.WriteLine("Does myURI3 have an extension: " + Path.HasExtension(myURI3.AbsoluteUri));
            Console.WriteLine("Does myURI4 have an extension: " + Path.HasExtension(myURI4.AbsoluteUri));

            Console.ReadLine();
        
    

EDITAR:

Basado en la edición del autor de la pregunta con respecto a determinar si la extensión es una válido extensión, he creado un nuevo código a continuación (copiar y pegar en una aplicación de consola):

using System;
using System.IO;
namespace ConsoleApplication1

    class Program
    
        static void Main(string[] args)
        
            Uri myUri1 = new Uri("http://www.somesite.com/folder/file.jpg?q=randomquery.string");
            string path1 = String.Format("0123", myUri1.Scheme, Uri.SchemeDelimiter, myUri1.Authority, myUri1.AbsolutePath);
            string extension1 = Path.GetExtension(path1);
            Console.WriteLine("Extension of myUri1: " + extension1);

            Uri myUri2 = new Uri("http://www.somesite.com/folder/?q=randomquerystring");
            string path2 = String.Format("0123", myUri2.Scheme, Uri.SchemeDelimiter, myUri2.Authority, myUri2.AbsolutePath);
            string extension2 = Path.GetExtension(path2);
            Console.WriteLine("Extension of myUri1: " + extension2);

            Console.ReadLine();
        
    

Este nuevo código ahora deconstruye todas las partes componentes de un objeto Uri (es decir, Scheme – el http parte, etc.) y específicamente elimina cualquier parte de la cadena de consulta del Uri. Esto soluciona el problema potencial como lo señaló Adriano en un comentario sobre esta respuesta de que la cadena de consulta podría contener un carácter de punto (lo que podría estropear el HasExtension método).

Una vez que se deconstruye el Uri, ahora podemos determinar correctamente tanto si el Uri string posee una extensión y también qué esa extensión es.

A partir de aquí, se trata simplemente de hacer coincidir esta extensión con una lista de extensiones válidas conocidas. Esta parte es algo que .NET framework nunca te dará como ninguna la extensión del archivo es potencialmente válida (¡cualquier aplicación puede crear su propia extensión de archivo si así lo desea!)

La propiedad Uri.IsFile sugerida por otros no funciona.

de los documentos

The IsFile property is true when the Scheme property equals UriSchemeFile.

file://server/filename.ext"

http://msdn.microsoft.com/en-us/library/system.uri.isfile.aspx

Lo que puede hacer es obtener AbsolutePath del URI (que corresponde a /contact o /images/logo.png, por ejemplo) y luego usar la clase FileInfo para verificar/obtener la extensión.

var uris = new List()

  new Uri("http://mysite.com/contact"),
  new Uri("http://mysite.com/images/logo.png"),
  new Uri("http://mysite.com/images/logo.png?query=value"),
;

foreach (var u in uris)

  var fi = new FileInfo(u.AbsolutePath);
  var ext = fi.Extension;
  if (!string.IsNullOrWhiteSpace(ext))
  
    Console.WriteLine(ext);
  

Probablemente necesite verificar una lista de extensiones admitidas para manejar los casos más complicados (contact.is.sortof.valid y contact.is.sortof.valid.png)

Pruebas:

"http://mysite.com/contact"                             //no ext
"http://mysite.com/contact?query=value"                 //no ext
"http://mysite.com/contact?query=value.value"           //no ext
"http://mysite.com/contact/"                            //no ext
"http://mysite.com/images/logo.png"                     //.png
"http://mysite.com/images/logo.png?query=value"         //.png
"http://mysite.com/images/logo.png?query=value.value"   //.png
"http://mysite.com/contact.is.sortof.valid"             //.valid
"http://mysite:123/contact.is.sortof.valid"              //.valid

Calificaciones y reseñas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *