我想知道是否有类似“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);
之后的所有内容,并且它最后都是删除所以它不会删除任何内容
答案 0 :(得分:1)
看起来你想:
string.TrimEnd()
删除任何尾部反斜杠。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
答案 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);
这将删除最后一个目录分隔符'/'字符。在此之后,您可以使用您的进一步逻辑来处理路径。