【问题标题】:StringBuilder remove characters until certain character is reachedStringBuilder 删除字符,直到达到某个字符
【发布时间】:2018-11-12 01:48:07
【问题描述】:

我正在开发一个功能类似于 MS-DOS 命令“cd”的程序。用户在程序提示中键入“cd..”,然后使用 Stringbuilder 删除代表用户当前目录的字符。它的功能如下:

Prompt> cd..

在代码文件中声明了一个 Stringbuilder 实例:

Stringbuilder builder = new Stringbuilder(@"E:\Folder");

在用户键入“cd..”并按 Enter 后,程序将删除 Stringbuilder 值末尾的目录,最终结果如下:

Stringbuilder builder = new Stringbuilder(@"E:\");

我不确定我该如何做到这一点,或者是否有可能做到。我想我可以尝试builder.Length - Directory.Length 来获取目录名称的长度,然后使用builder.Remove(int StartIndex, int length),但我不知道如何实现。

我可能使用的另一件事是使用builder.ToString() 并将其拆分,使用反斜杠作为分隔符。

有什么建议吗?

【问题讨论】:

  • 你为什么要使用StringBuilderSubstringLastIndexOf 不是更容易吗?
  • 你可以使用:'Path.GetDirectory'。
  • 使用Path 方法构建文件路径,而不是字符串连接。路径构造规则are more complicated than you realize.
  • 出于兼容性原因,我尽量不使用LastIndexOf
  • LastIndexOf(char) 在 C# 可以运行的任何地方运行。自 1.1 以来,它就是 .net 框架的一部分。你在说什么兼容性?

标签: c# console stringbuilder


【解决方案1】:

您可以使用Path.GetDirectoryName,但这有点愚蠢。它只是在不知道文件系统实际上是什么样子的情况下进行字符串操作。例如,如果您执行Path.GetDirectoryName(@"E:\Folder\"),它将返回"E:\Folder",因为您给它的字符串末尾有一个斜杠。或者你可以给它一个甚至不存在的文件夹,它仍然会给你一个答案。

我可以建议另一种方法:为当前工作目录保留一个DirectoryInfo 对象。例如:

var curDirectory = new DirectoryInfo(@"E:\Folder");

当你需要显示它时,使用curDirecotry.FullName,它将返回完整路径,如"E:\Folder"。然后当你需要上一个目录时,它是没有字符串操作的一行:

curDirectory = curDirectory.Parent;

虽然你必须检查它是否有null,因为如果你已经在驱动器的根目录,Parent 将是null

DirectoryInfo 实际上会查看文件系统,因此您可以确定它始终有效。另外,您也可以使用它来查看文件夹的内容,我相信您会想要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2011-01-20
    • 2011-03-24
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多