【问题标题】:Removing drive (or network name) from path in C#从 C# 中的路径中删除驱动器(或网络名称)
【发布时间】:2011-12-08 00:31:00
【问题描述】:

在 C# 中从绝对路径中删除驱动器名称、网络路径等的最简洁(但安全)的方法是什么?

例如转换

\\networkmachine\foo\bar

C:\foo\bar

\foo\bar

似乎已经回答了很多关于路径问题的问题,但我找不到我要找的东西。我自己想到的第一个想法是使用 Path.GetFullPath() 来确保我确实在使用绝对路径,然后只使用正则表达式来查找不与另一个斜杠相邻的第一个斜杠。但是,使用正则表达式进行路径操作似乎有点危险。

获取驱动器号/目标网络机器/等,将字符串转换为 Uri,并询问相对于驱动器/机器的路径,然后转换回字符串可能更明智吗?还是有更好的方法?

【问题讨论】:

  • 我已经编写了自己的辅助函数来处理这个问题。只是一些if...else 和字符串操作。
  • 那么与我们分享这些方法可能会很好。否则,您的评论毫无用处:)
  • 您可以从路径的开头去除从Path.GetPathRoot() 返回的字符串,但这也会从网络路径中去除foo,因为这是共享名称。
  • 或者,如果您正在执行大部分这些操作,您可能需要查看 alphafs.codeplex.com,其中包含 .NET 提供的一些附加路径操作选项以及对扩展路径的支持(在标准.NET)

标签: c# .net path


【解决方案1】:

使用

string MyPath = @""; // \\networkmachine\foo\bar OR C:\foo\bar
string MyPathWithoutDriveOrNetworkShare = MyPath.Substring (Path.GetPathRoot(MyPath).Length);

C:\foo\bar 的结果为 foo\bar\\networkmachine\foo\bar 的结果为 bar

有关 MSDN 参考,请参阅 http://msdn.microsoft.com/en-us/library/system.io.path.getpathroot.aspx

编辑 - 根据 cmets:

使用“string voodoo”(恕我直言不简洁,因此不推荐),您可以这样做:

if ( ( MyPath.IndexOf (":") == 1 ) || ( MyPath.IndexOf ( "\\\\" ) == 0 ) )
     { MyPathWithoutDriveOrNetworkShare = MyPath.Substring (2); }
if ( MyPathWithoutDriveOrNetworkShare.IndexOf ( "\\" ) > 0 )
     MyPathWithoutDriveOrNetworkShare = MyPathWithoutDriveOrNetworkShare.Substring ( MyPathWithoutDriveOrNetworkShare.IndexOf ( "\\" ) );  

【讨论】:

  • 但这不会给出他在上面的网络路径示例中要求的路径,因为在这种情况下 GetPathRoot 将返回 \\networkmachine\foo。
【解决方案2】:

你看过 DirectoryInfo 类吗?

特别是 DirectoryInfo.Parent 和 DirectoryInfo.Root 可能有助于发现根目录,以便您可以将其从 FullName 中删除

家长: http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.parent.aspx

根: http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.root.aspx

【讨论】:

    【解决方案3】:

    我不知道安全性,但我会亲自将其放入字符串中,查找 contains("\\") 或 ':' 并通过在它们周围添加子字符串将它们从字符串中删除。

    【讨论】:

      【解决方案4】:

      根据要求,我是这样做的:

      我写了一个助手class PathHelper,它可以做我认为提问者想知道的事情。

      你可以找到library on CodeProject,我会使用的函数是PathHelper.GetDriveOrShare,方式类似于:

      var s = @"C:\foo\bar";
      var withoutRoot = s.Substring( PathHelper.GetDriveOrShare(s).Length ); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        相关资源
        最近更新 更多