【问题标题】:Remove parts of string删除部分字符串
【发布时间】:2017-07-02 14:03:37
【问题描述】:

我有以下字符串

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";

我正在尝试删除部分字符串,所以最后我想留下

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB";

所以目前我正在做

string b = a.Remove(a.LastIndexOf('\\'));
string c = b.Remove(b.LastIndexOf('\\'));
Console.WriteLine(c);

这给了我正确的结果。我想知道是否有更好的方法来做到这一点?因为我不得不在很多地方这样做。

注意:SubdirectoryC 的长度未知。因为它是由用户输入的数字/字母组成的

【问题讨论】:

  • 您是否总是只想上 1 个目录?
  • 或者SubdirectoryC总是一样的?
  • @BugFinder 是的,据我所知目前是这样
  • @Pikoh SubdirectoryC 永远不应该是一样的
  • 您的示例并没有真正解释您想要实现的目标。你能用一些指令来描述它吗,比如“我希望代码上升两个目录”或“我希望代码上升直到它到达某个给定名称的子目录”?

标签: c# string directory


【解决方案1】:

Path.GetDirectoryName

string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";
string b = Path.GetDirectoryName(Path.GetDirectoryName(a));

正如 MSDN 中所解释的,如果你传递一个目录,它也可以工作

....将返回的路径传递回 GetDirectoryName 方法将 导致每次后续调用都会截断一个文件夹级别 结果字符串

当然,如果您至少有两个目录级别,这是安全的

【讨论】:

  • 你让我看起来像个白痴!.. 就这么简单,嘿.. 谢谢你,我可以把它变成一个辅助方法,这样我就可以重复使用它了。时间到了我会尽快回复的
  • 不要对自己太苛刻。记住 NET Framework 上可用的所有内容(以及详细的细节)是不可能的。
  • 部分不相关的旁注:如果你想得到SubdirectoryB 的名字,你必须使用Path.GetFileName,这不是最容易记住的。
【解决方案2】:

嘿嘿,

如果你只是想摆脱最后一部分。 你可以使用:

var parentDirectory = Directory.GetParent(Path.GetDirectoryName(path));

https://msdn.microsoft.com/de-de/library/system.io.directory.getparent(v=vs.110).aspx

【讨论】:

    【解决方案3】:

    对于这样的重复任务,一个好的解决方案往往是写一个扩展方法,例如

    public static class Extensions
    {
        public static string ChopPath(this string path)
        {
            // chopping code here
        }
    }
    

    然后你可以在任何你需要的地方使用它:

    var chopped = a.ChopPath();
    

    【讨论】:

    • 这没有回答所提出的问题。问题是在ChopPath 里面放什么而不是如何编写扩展方法。
    • 请重新阅读,他问道:“有没有更好的方法来做到这一点?因为我不得不在很多地方这样做。”我提出了一个更好的方法,虽然没有评论如何砍(因为这有效),但如何避免他所说的冗余。要求更好并不意味着它可以通过一种方式改进,有时它有多个方面,我正在描述其中之一。
    • 问题归结为“如何从提供的字符串中获取目录路径”,只是措辞不佳。我明白你是如何解释这个问题的,我只是不相信这是 OP 所要求的,因此我投了反对票。
    【解决方案4】:

    一些替代品

    string a = @"\\server\MainDirectory\SubDirectoryA\SubdirectoryB\SubdirectoryC\Test.jpg";
    
    var b = Path.GetFullPath(a + @"\..\..");
    
    var c = a.Remove(a.LastIndexOf('\\', a.LastIndexOf('\\') - 1));
    

    但我确实发现这种字符串扩展通常很有用:

    static string beforeLast(this string str, string delimiter)
    {
        int i = str.LastIndexOf(delimiter);
        if (i < 0) return str;
        return str.Remove(i);
    }
    

    【讨论】:

      【解决方案5】:

      使用 Linq 的替代答案:

      var b = string.Join("\\", a.Split(new string[] { "\\" }, StringSplitOptions.None)
                                 .Reverse().Skip(2).Reverse());
      

      【讨论】: