【问题标题】:Physical, Relative, Absolute and other paths物理、相对、绝对和其他路径
【发布时间】:2023-03-30 10:37:01
【问题描述】:

我的任务是编写一个可以接收不同类型的路径/url 的对象,并返回它是什么类型的路径/url。例如路径可以是

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还是绝对uri相对容易,但是如何知道它是否是UNC路径?

我尝试使用 Uri 对象,它是 IsUnc 属性,但它并没有真正帮助我....对于 c:\temp 它返回 false,对于 "/temp"、"temp/" 和 "temp" 它会抛出一个格式不正确的异常。 .NET 3.5 中是否存在任何可以帮助我解决此问题的内置对象,或者我可以使用什么算法来确定路径的类型?

【问题讨论】:

  • 嗯,"/temp" 确实根本不是 URI。您要检查的确切格式是什么?如果只是路径和 URI,您可以先区分它们,然后对它们应用不同的技术。
  • 为什么“/temp”不是有效的URI?我认为它可以解释为相对的。我需要检查所有这些格式并确定它是什么类型...是 UNC 路径还是 URI 路径...我如何区分它们?
  • 好吧,tools.ietf.org/html/rfc3986。它不以方案开头,例如(http: 或 file: 可以)
  • 您可以尝试 (1) 使用new Uri(s)Uri.TryCreate 将字符串解析为URI; (2) 如果失败,尝试将字符串视为路径
  • 我试过了,但是对于 C:\Temp,new Uri() 没有失败,但是 IsUnc 属性返回 false

标签: c# .net path uri unc


【解决方案1】:

试试这个:

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。
  • 然后将“IsFile”分支更改为打印“PhysicalPath”而不是“UNC 路径”和“文件 URI”。
  • System.Uri 将协议相对视为相对,但在大多数安全上下文中,这些应视为绝对路径。所以http://gmail.com 是绝对的,但//gmail.com 是相对的,即使它要去不同的域。
  • @yzorg:我无法重现 - 在 3.5 和 4.5 中,new Uri("//gmail.com") 将字符串视为 UNC 路径。但是,它仍然不正确,在我看来它是一个错误。
  • @RichardDeeming 我不关心 UNC 路径,我全职从事 http/web 应用程序工作。浏览器在没有特殊配置的情况下不会处理来自http://file://,所以file:// 和UNC 对我来说已经死了。我认为 System.Uri 的 UNC 功能不是错误,而是 10 年前(或更长时间)编写的 .NET 的时代错误。
猜你喜欢
  • 2011-06-30
  • 2010-09-15
  • 2013-07-14
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多