Come posso utilizzare IndexOf di scegliere una specifica personaggio quando ci sono più di uno di loro?

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

  •  26-09-2019
  •  | 
  •  

Domanda

Come posso utilizzare IndexOf con SUBSTRING di scegliere una specifica personaggio quando ci sono più di uno di loro? Ecco il mio problema. Voglio prendere il percorso "C: \ Users \ Jim \ AppData \ Local \ Temp \" e rimuovere il "Temp \" parte. Lasciando solo "C: \ Users \ Jim \ AppData \ Local \" Ho risolto il mio problema con il codice qui sotto, ma questo presuppone che il "Temp" cartella è in realtà chiamato "Temp". Esiste un modo migliore? Grazie

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);
}}
È stato utile?

Soluzione

Il modo migliore è quello di utilizzare Directory.GetParent() o 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);
    }    
}

(Si noti che Directory.GetParent(path) appena ti dà la directory Temp, in quanto non capisce che il percorso è già destinata ad essere una directory.)

Se davvero si voleva utilizzare LastIndexOf però, l'uso del sovraccarico che consente per specificare la posizione di partenza .

Altri suggerimenti

Perché non solo gestire questo utilizzando direttamente le classi di sistema?

string folder = Environment.GetFolder(Environment.SpecialFolder.LocalApplicationData);

Gli altri answerers hanno dimostrato il modo migliore per raggiungere il tuo obiettivo. Nell'interesse di espandere ulteriormente la vostra conoscenza, vi suggerisco di guardare le espressioni regolari per la stringa di corrispondenza e sostituzione esigenze, in generale.

ho passato i primi due anni della mia carriera di programmazione autodidatta fare di più contorto che si possa immaginare manipolazione di stringhe prima di rendermi conto che qualcun altro aveva già risolto tutti questi problemi, e ho preso una copia di Mastering Regular Expressions . Io lo consiglio vivamente.

Un modo per togliere l'ultima directory è con la seguente espressione regolare:

tempDir = Regex.Match(tempDir, @".*(?=\\[^\\]+)\\?").Value;

Può sembrare criptico, ma questo sarà effettivamente rimuovere l'ultimo elemento dal percorso, indipendentemente dal suo nome, e indipendentemente dal fatto che v'è un altro \ alla fine.

Vorrei utilizzare la classe DirectoryInfo.

DirectoryInfo tempDirectory = new DirectoryInfo(Path.GetTempPath());            
DirectoryInfo tempDirectoryParent = tempDirectory.Parent;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top