10
votes

Meilleure façon de casser une corde sur le dernier point sur c #

Quel serait le meilleur moyen et plus idiomatique de briser une ficelle en deux à la place du dernier point? Essentiellement séparer l'extension du reste d'un chemin dans un chemin de fichier ou une URL. Jusqu'à présent, ce que je fais est divisé (".") Et ensuite string.join (".") De tout sauf la dernière partie. On dirait que d'utiliser un bazooka pour tuer les mouches.


0 commentaires

9 Réponses :


8
votes

Vous pouvez utiliser path.getfilenamewithoutextension () strong>

ou si cela ne fonctionnera pas pour vous: p>

int idx = filename.LastIndexOf('.');

if (idx >= 0)
   filename = filename.Substring(0,idx);


5 commentaires

Cela fonctionnera-t-il sur des morceaux d'URL (en utilisant / au lieu de \)? Et cela renvoie-t-il aussi les "dossiers"? Path.getfilename () ne renvoie que le nom du fichier, sans répertoires, afaik.


Si l'OP avait posé des questions sur les chemins de fichiers uniquement, ce serait un +1. Mais les documents System.IO.Path ne mentionnent pas la prise en charge des URL.


Correct, mais cela peut avoir travaillé pour vous si le nom de fichier n'incluait pas de chemin.


Cela pourrait fonctionner, mais malheureusement, cela signifie s'appuyer sur une caractéristique non documentée. Si c'est bien pour vous, System.IO.Path est la solution au problème.


Si les gens se demandent pourquoi path.getextension, etc., ne serait pas Travailler: les différentes fonctions de chemin supposent que vous travaillez avec un chemin Windows ... Donc, ils jettent si votre chaîne contient des caractères non valides , comme '<'. J'ai couru dans une affaire juste là où je voulais l'extension d'un dossier qui venait de quelque part où "<" était parfaitement valide et allait ailleurs où il était aussi, ce qui m'a été fait ici à la recherche d'un moyen pur String sur le dernier point, sans le cadre qui tente d'être intelligent et de penser que c'est un nom de fichier, il est donc préférable de faire plus de validation.



2
votes

la méthode de la chaîne LastIndexof peut-être de certains Utilisez-vous ici ici.

Mais les opérateurs de chemin ou de fichierInfo seront mieux adaptés aux opérations basées sur le nom de fichier.


0 commentaires

1
votes

Je pense que ce que vous cherchez vraiment est Path.getfilenameWithOntExtension (System.io) mais juste pour le diable:

string input = "foo.bar.foobar";
int lastDotPosition = input.LastIndexOf('.');

if (lastDotPosition == -1)
{
    Console.WriteLine("No dot found");
}
else if (lastDotPosition == input.Length - 1)
{
    Console.WriteLine("Last dot found at the very end");

}
else
{
    string firstPart = input.Substring(0, lastDotPosition);
    string lastPart = input.Substring(lastDotPosition + 1);

    Console.WriteLine(firstPart);
    Console.WriteLine(lastPart);
}


0 commentaires

2
votes

Pour obtenir le chemin sans l'extension, utilisez

if (path == null)
{
    return null;
}
int length = path.LastIndexOf('.');
if (length == -1)
{
    return path;
}
return path.Substring(0, length);


0 commentaires

1
votes

0 commentaires

26
votes

Si vous voulez des performances, quelque chose comme: xxx


0 commentaires

1
votes

Qu'en est-il de l'utilisation de la méthode LastIndexof qui renvoie la dernière position trouvée d'un personnage. Ensuite, vous pouvez utiliser la sous-chaîne pour extraire ce que vous voulez.


0 commentaires

1
votes

string.lastindexof vous retournera la position du point si elle existe jamais dans la chaîne. Vous pouvez ensuite String.Substring Méthodes pour diviser la chaîne.


0 commentaires

1
votes

Vous pouvez utiliser la méthode de chaîne

LastIndexof et Substring pour accomplir la tâche.


0 commentaires