c# - 有什么像BeforeLastIndexOf?

时间:2018-02-25 19:25:14

标签: c# indexof lastindexof

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

"\"

因为它只删除了最后一个string input = Console.ReadLine(); int index = input.LastIndexOf("/"); if (index > 0) input = input.Substring(0, index + 1); 之后的所有内容,并且它最后都是删除所以它不会删除任何内容

3 个答案:

答案 0 :(得分:1)

看起来你想:

  1. 使用string.TrimEnd()删除任何尾部反斜杠。
  2. 调用Path.GetDirectoryName()去除最后一个目录。
  3. 例如:

    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
    

答案 1 :(得分: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有一个外观,则该变量也将设置为/,但不会在其前面显示第二个。

答案 2 :(得分:0)

在执行任何其他操作之前,只需使用TrimEnd

 input = input.TrimEnd(Path.DirectorySeparatorChar);

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