【问题标题】:c# - is there anything like BeforeLastIndexOf?c# - 有没有像 BeforeLastIndexOf 这样的东西?
【发布时间】:2018-02-25 19:25:13
【问题描述】:

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

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

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

【问题讨论】:

  • 你想要Directory.Delete(input, true);吗?这将删除指定的目录(这是路径中的“最后一个”文件夹),无论尾部斜杠如何。
  • 我的意思是从字符串中删除它

标签: c# indexof lastindexof


【解决方案1】:

看起来你想要:

  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

【讨论】:

  • 你正在做的是一个杂牌。您假装路径名中的最后一段是文件名,但它是目录名。我不认为破解 .NET 是编写软件的好方法。正确的做法是使用DirectoryDirectoryInfo 来解析整个路径。
  • @ZoranHorvat 这不是杂牌。 The documentation for Path.GetDirectoryName() 专门描述了这种行为。
【解决方案2】:

我认为您的问题没有抓住重点。如果您想操作目录路径,那么您应该使用来自 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,而不是第二次出现在它之前。

【讨论】:

  • LastInputOf 不存在
  • 已修复,第二次调用时打错了。
  • 没错,但你的也不起作用,也没有任何改变
【解决方案3】:

在做其他事情之前使用TrimEnd

 input = input.TrimEnd(Path.DirectorySeparatorChar);

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

【讨论】:

  • 这将不必要地构造一个全新的字符串。
  • 它只会删除最后一个不需要的字符。当然还有新字符串,您可以在逻辑中进一步使用。如果您想要相同的变量,则分配回输入。编辑答案@ZoranHorvat
  • @ZoranHorvat - 字符串是不可变的,任何更改都会创建一个新字符串。
  • @Null511 这就是我的观点 - 这一步会不必要地构造一个新字符串而不会产生所需的内容。
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多