c# - 有类似 BeforeLastIndexOf 的东西吗?

c# - is there anything like BeforeLastIndexOf?

我想知道是否有类似“BeforeLastIndexOf”的东西。我是 c# 的新手,真的不知道“LastIndexOf”和“IndexOf”是如何工作的。我想要实现的是,例如用户在一个目录中键入内容,它从字符串中删除该目录的最后一个文件夹,但通常目录看起来像这样“C:\something\something\”并且它有一个 "\" 最后,所以像这样的代码不起作用:

string input = Console.ReadLine();
int index = input.LastIndexOf("/");
if (index > 0)
     input = input.Substring(0, index + 1);

因为它只删除最后一个 "\" 之后的所有内容,而且它无论如何都在最后,所以它不会删除任何内容

我认为你的问题没有抓住重点。如果你想操纵目录路径,那么你应该使用 System.IO 命名空间中的类型,并让它们正确地做这件事。例如,在给定目录的完整路径的情况下查找直接父目录可以这样完成:

string parentPath = new DirectoryInfo(fullPath).Parent.FullName;

如果您仍然想自己做,那么有一个 LastIndexOf 的重载,它接受搜索范围 (https://msdn.microsoft.com/en-us/library/d0z3tk9t(v=vs.110).aspx)。但是,您必须确保不要访问字符串中不存在的索引。

string final = input;
int secondLast = input.LastIndexOf("/");
if (secondLast >= 0)
{
    secondLast = input.LastIndexOf("/", secondLast - 1, secondLast);
}

if (secondLast >= 0)
{
    final = input.Substring(0, secondLast + 1); // Includes final '/'
}

执行此代码时,secondLast 变量将设置为 -1,或者设置为倒数第二个出现的 / 的索引。请注意,如果 / 出现一次,变量也将设置为 -1,但在它之前出现的第二个不会。

看起来你想要:

  1. 使用 string.TrimEnd().
  2. 删除所有结尾的反斜杠
  3. 调用Path.GetDirectoryName()剥离最后一个目录。

例如:

string path1 = @"C:\something\something\";
Console.WriteLine(Path.GetDirectoryName(path1.TrimEnd('\'))); // Prints "C:\something

string path2 = @"C:\something\something";
Console.WriteLine(Path.GetDirectoryName(path2.TrimEnd('\'))); // Prints "C:\something

如果你也想处理 / 个字符(因为这实际上是 Windows 中的有效路径分隔符),你可以在 TrimEnd():

path1.TrimEnd('/', '\')

因此:

string path3 = @"C:/something/something//\/";
Console.WriteLine(Path.GetDirectoryName(path3.TrimEnd('/', '\'))); // Prints "C:\something

在做其他事情之前先使用 TrimEnd

 input = input.TrimEnd(Path.DirectorySeparatorChar);

这将删除最后一个目录分隔符“/”。在此之后,您可以使用您的进一步逻辑来处理路径。