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
,但在它之前出现的第二个不会。
看起来你想要:
- 使用
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
在做其他事情之前先使用 TrimEnd
input = input.TrimEnd(Path.DirectorySeparatorChar);
这将删除最后一个目录分隔符“/”。在此之后,您可以使用您的进一步逻辑来处理路径。
我想知道是否有类似“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
,但在它之前出现的第二个不会。
看起来你想要:
- 使用
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
在做其他事情之前先使用 TrimEnd
input = input.TrimEnd(Path.DirectorySeparatorChar);
这将删除最后一个目录分隔符“/”。在此之后,您可以使用您的进一步逻辑来处理路径。