0

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

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

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

4

3 回答 3

2

看起来你想要:

  1. 使用 . 删除任何尾随反斜杠string.TrimEnd()
  2. 调用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
于 2018-02-25T19:36:07.127 回答
0

TrimEnd在做任何其他事情之前使用

 input = input.TrimEnd(Path.DirectorySeparatorChar);

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

于 2018-02-25T19:36:09.063 回答
0

我认为您的问题没有抓住重点。如果您想操作目录路径,那么您应该使用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请注意,如果 出现第一次,变量也将设置为/,而不是第二次出现在它之前。

于 2018-02-25T19:28:31.657 回答