Ответ 1
Вы можете использовать метод HasExtension
класса System.IO.Path
чтобы определить, имеет ли строка Uri расширение.
Используя свойство AbsoluteUri
объекта Uri
, вы можете получить полную строку, которая представляет Uri. Передача этой строки в метод Path класса HasExtension
будет правильно возвращать логическое значение, указывающее, содержит ли Uri расширение файла.
Скопируйте и вставьте следующий код в простое консольное приложение, чтобы проверить это. Только myUri3
и myUrl4
возвращают True, что также демонстрирует, что метод HasExtension
может правильно обрабатывать дополнительные символы (например, строки запросов) после имени файла (и расширения).
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();
}
}
}
РЕДАКТИРОВАТЬ:
Основываясь на вопросе редактора вопроса о том, является ли расширение допустимым расширением, я создал новый код ниже (скопируйте и вставьте в консольное приложение):
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("{0}{1}{2}{3}", 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("{0}{1}{2}{3}", myUri2.Scheme, Uri.SchemeDelimiter, myUri2.Authority, myUri2.AbsolutePath);
string extension2 = Path.GetExtension(path2);
Console.WriteLine("Extension of myUri1: " + extension2);
Console.ReadLine();
}
}
}
Этот новый код теперь де-конструирует все составные части объекта Uri (т.е. Scheme - часть http
и т.д.) И специально удаляет любую часть строки запроса Uri. Это позволяет обойти потенциальную проблему, как отметил Адриано в комментарии к этому ответу, что строка запроса может содержать символ точки (что может привести к HasExtension
методе HasExtension
).
После того, как Uri де-конструирован, мы можем теперь правильно определить, имеет ли строка Uri расширение, а также что это расширение.
Отсюда это просто случай сопоставления этого расширения со списком известных допустимых расширений. Эта часть - то, что .NET Framework никогда не даст вам, так как любое расширение файла потенциально допустимо (любое приложение может создать собственное расширение файла, если оно того пожелает!)