Como posso usar o indexOF para escolher um personagem específico quando há mais de um deles?

StackOverflow https://stackoverflow.com/questions/2632494

  •  26-09-2019
  •  | 
  •  

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);
}}
Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top