C# - есть ли что-то вроде 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);
Потому что он удаляет только все после последнего "\"
и это в любом случае в конце, так что ничего не удаляет
3 ответа
Похоже, вы хотите:
- Удалите все обратные косые черты, используя
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);
Это удалит последний символ разделителя каталогов '/'. После этого вы можете использовать свою дальнейшую логику для работы с путем.
Я думаю, что вы не поняли суть вопроса. Если вы хотите манипулировать путями в каталогах, вам следует использовать типы из 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
если есть одно появление /
, но не второй, который предшествует этому.