您可以使用该类的HasExtension
方法System.IO.Path
来确定 Uri 的字符串是否具有扩展名。
通过使用对象的AbsoluteUri
属性Uri
,您可以检索代表 Uri 的完整字符串。将此字符串传递给 Path 类的HasExtension
方法将正确返回一个布尔值,指示 Uri 是否包含文件扩展名。
将以下代码复制并粘贴到一个简单的控制台应用程序中以进行测试。只有myUri3
并myUrl4
返回True,这也说明该HasExtension
方法可以正确处理文件名(和扩展名)后面的附加字符(即Querystrings)。
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 的任何查询字符串部分。这解决了Adriano在对此答案的评论中指出的潜在问题,即查询字符串可能包含点字符(从而可能会弄乱该HasExtension
方法)。
解构 Uri 后,我们现在可以正确确定 Uri 字符串是否具有扩展名以及该扩展名是什么。
从这里开始,这只是将此扩展名与已知有效扩展名列表进行匹配的情况。这部分是 .NET 框架永远不会提供给您的,因为任何文件扩展名都可能有效(如果需要,任何应用程序都可以组成自己的文件扩展名!)