物理路径、相对路径、绝对路径及其他路径

12

我需要写一个对象,它可以接收不同类型的路径/网址,并返回它是哪种类型的路径/网址。例如,路径可以是

1. [drive]:\Temp 
2. \\Temp 
3. Temp (assuming that it relative Temp), 
4. /Temp 
5. ~/Temp 
6. file://[drive]:/Temp 
7. file://Temp 
8. [scheme]://something/Temp

如何在C#中检查是物理路径、相对URL还是绝对URL?判断它是否为相对或绝对URI相对较容易,但如何知道它是否为UNC路径呢?我尝试使用Uri对象及其IsUnc属性,但它并没有真正帮助我... 对于c:\temp,它返回false;对于“/temp”,“temp/”和“temp”,它会抛出一个格式不正确的异常。是否存在.NET 3.5中的任何内置对象可以帮助我解决这个问题,或者我可以使用什么算法来确定路径类型?


“/temp”实际上根本不是URI。您要检查的确切格式是什么?如果只是路径和URI,您可以首先区分它们,并为每个应用不同的技术。 - Vlad
为什么“/temp”不是有效的URI?我认为它可以被解释为相对路径。我需要检查所有这些格式并决定它是哪种类型,它是UNC路径还是URI路径,我如何区分它们? - Alex Dn
您可以尝试以下方法来处理字符串:(1) 使用new Uri(s)Uri.TryCreate将其解析为URI;(2) 如果失败,尝试将字符串视为路径。 - Vlad
我尝试过了,但对于C:\Temp,new Uri()不会失败,但IsUnc属性返回false。 - Alex Dn
这可能是Uri类中的一种怪癖,因为C:\Temp实际上不是URI。然而,它也不是UNC路径,而是本地路径。在这里查找可能的路径格式 - Vlad
显示剩余3条评论
1个回答

28

试试这个:

var paths = new[]
{
   @"C:\Temp",
   @"\\Temp",
   "Temp",
   "/Temp",
   "~/Temp",
   "file://C:/Temp",
   "file://Temp",
   "http://something/Temp"
};

foreach (string p in paths)
{
   Uri uri;
   if (!Uri.TryCreate(p, UriKind.RelativeOrAbsolute, out uri))
   {
      Console.WriteLine("'{0}' is not a valid URI", p);
   }
   else if (!uri.IsAbsoluteUri)
   {
      Console.WriteLine("'{0}' is a relative URI", p);
   }
   else if (uri.IsFile)
   {
      if (uri.IsUnc)
      {
         Console.WriteLine("'{0}' is a UNC path", p);
      }
      else
      {
         Console.WriteLine("'{0}' is a file URI", p);
      }
   }
   else
   {
      Console.WriteLine("'{0}' is an absolute URI", p);
   }
}

输出:

'C:\Temp' 是一个文件URI
'\\Temp' 是一个UNC路径
'Temp' 是一个相对URI
'/Temp' 是一个相对URI
'~/Temp' 是一个相对URI
'file://C:/Temp' 是一个文件URI
'file://Temp' 是一个UNC路径
'http://something/Temp' 是一个绝对URI


谢谢,但对于值为'C:\Temp'、'\Temp'、'file://C:/Temp'和'file://Temp'的情况,我的对象应该返回“PhysicalPath”而不是URI。 - Alex Dn
然后将“IsFile”分支更改为打印“PhysicalPath”,而不是“UNC路径”和“文件URI”。 - Richard Deeming
System.Uri将协议相对路径视为相对路径,但在大多数安全上下文中,这些路径应该被视为绝对路径。因此,http://gmail.com是绝对路径,但//gmail.com是相对路径,即使它指向不同的域名。 - yzorg
@yzorg:我无法重现这个问题 - 在3.5和4.5中,new Uri("//gmail.com")将字符串视为UNC路径。然而,这仍然不正确,看起来像是一个bug。 - Richard Deeming
@RichardDeeming 我不关心UNC路径,我全职从事http/web应用程序开发。浏览器在没有特殊配置的情况下无法处理http://中的file://,因此file://和UNC对我来说已经过时了。我认为System.Uri的UNC功能不是一个bug,而是.NET十年前(或更早)编写时的陈旧现象。 - yzorg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接