Como posso usar o indexOF para escolher um personagem específico quando há mais de um deles?
Pergunta
Como posso usar o IndexOF com a substring para escolher um personagem específico quando há mais de um deles? Aqui está o meu problema. Quero seguir o caminho "C: Users Jim AppData Local Temp " e remover a parte "temp ". Deixando apenas "C: Users Jim AppData Local " Eu resolvi meu problema com o código abaixo, mas isso pressupõe que a pasta "Temp" é realmente chamada de "Temp". Existe uma maneira melhor? Obrigado
if (Path.GetTempPath() != null) // Is it there?{
tempDir = Path.GetTempPath(); //Make a string out of it.
int iLastPos = tempDir.LastIndexOf(@"\");
if (Directory.Exists(tempDir) && iLastPos > tempDir.IndexOf(@"\"))
{
// Take the position of the last "/" and subtract 4.
// 4 is the lenghth of the word "temp".
tempDir = tempDir.Substring(0, iLastPos - 4);
}}
Solução
A melhor maneira é usar Directory.GetParent()
ou DirectoryInfo.Parent
:
using System;
using System.IO;
class Test
{
static void Main()
{
string path = @"C:\Users\Jim\AppData\Local\Temp\";
DirectoryInfo dir = new DirectoryInfo(path);
DirectoryInfo parent = dir.Parent;
Console.WriteLine(parent.FullName);
}
}
(Observe que Directory.GetParent(path)
Apenas fornece o diretório temporário, pois não entende que o caminho já deve ser um diretório.)
Se você realmente queria usar LastIndexOf
Porém, use a sobrecarga que permite especificar o local de início.
Outras dicas
Por que não lidar com isso diretamente usando as classes do sistema?
string folder = Environment.GetFolder(Environment.SpecialFolder.LocalApplicationData);
As outras respostas mostraram a melhor maneira de atingir seu objetivo. No interesse de expandir ainda mais seu conhecimento, sugiro que você observe expressões regulares para as necessidades de correspondência e substituição de strings, em geral.
Passei os primeiros dois anos da minha carreira de programação autodidata fazendo a manipulação de cordas mais complicada que se possa imaginar antes de perceber que alguém já havia resolvido todos esses problemas, e peguei uma cópia de Dominar expressões regulares. Eu recomendo fortemente.
Uma maneira de tirar o último diretório é com a seguinte expressão regular:
tempDir = Regex.Match(tempDir, @".*(?=\\[^\\]+)\\?").Value;
Pode parecer enigmático, mas isso realmente removerá o último item do caminho, independentemente de seu nome, e independentemente de haver outro \
no final.
Eu usaria a classe DirectoryInfo.
DirectoryInfo tempDirectory = new DirectoryInfo(Path.GetTempPath());
DirectoryInfo tempDirectoryParent = tempDirectory.Parent;