2009-05-15 5 views
1

Cela semble être un problème très étrange que je ne peux pas comprendre pour la vie de moi. J'ai un chemin (string) qui ressemble à ceci:Problème Vérification de la fin d'une chaîne

D: \ développement \ php \ bchat \ le chat \ index.php

Je dois vérifier si le fichier en question est un PHP fichier. Je pense que la façon la plus logique est de prendre une sous-chaîne à partir de. à la fin de la chaîne et de voir si elle == .php

donc j'ai essayé:

bool isphp = (path.Substring(path.LastIndexOf('.')) == ".php") ? true : false; 

Ce toujours retourne faux. Je pensais que peut-être il y avait un espace de fin à la fin me foutant donc je mis un TrimEnd() sur le chemin avant. Mais cela n'a rien changé. Alors j'ai essayé ceci:

bool isphp = (path.EndsWith(".php") == true) ? true : false; 

Cela renvoie également toujours faux.

EDIT J'ai maintenant aussi essayé ceci:

bool isphp = (Path.GetExtension(path) == ".php"); 

Mais cela renvoie aussi faux.

+2

Veuillez ne pas vérifier un bool pour une valeur de bool, puis choisissez un autre bool. Faites simplement bool isphp = php.EndsWith (". Php"); (Si vous voulez utiliser une comparaison de chaînes pour cela, sinon voir les réponses ci-dessous) –

+1

Point trivial, mais (path.EndsWith (". php") == true)? vrai faux; peut être condensé à path.EndsWith (". Php"), ce qui renvoie true ou false. – spender

+0

Nitpickers ci-dessus, vous pouvez clairement voir qu'il testait, et ainsi modifié son premier code pour obtenir le second, ce qui explique pourquoi il y avait redondance. –

Répondre

3

Le code suivant fonctionne très bien sur ma machine:

public static void Main() 
    { 
     string path = @"D:\development\php\bchat\chat\index.php"; 
     bool isPhp = path.EndsWith(".php"); 
     Console.WriteLine(isPhp); 
    } 

donc je crois qu'il ya quelque chose d'autre au sujet de votre chaîne le fait ne pas fonctionner. Peut-être que c'est un cas, auquel cas ajoutez StringComparison.InvariantCultureIgnoreCase à votre appel EndsWith comme ceci.

public static void Main() 
    { 
     string path = @"D:\development\php\bchat\chat\index.pHp"; 
     bool isPhp = path.EndsWith(".php", StringComparison.OrdinalIgnoreCase); 
     Console.WriteLine(isPhp); 
    } 

Si cela ne fonctionne pas mettre un point d'arrêt sur la ligne de comparaison et puis tapez ceci dans la fenêtre immédiate:

path[path.Length-1] 

Vous devriez obtenir ceci comme résultat:

112 'p' 

Si ce n'est pas le cas, vous pouvez dire que votre chemin ne se termine pas par un caractère p standard.

+0

Mieux vaut utiliser StringComparison.OrdinalIgnoreCase puisque la culture (même invariant) n'est pas appropriée avec les noms de fichiers. – Richard

+0

@Richard: Bon point, j'ai mis à jour le code pour inclure ce changement. –

+0

Merci. Pour une raison quelconque, Trim() ne supprimait pas l'espace de fin. donc je devais pirater ça –

8

Utilisez la classe Path. Il a une méthode GetExtension():

var path = @"D:\development\php\bchat\chat\index.php"; 
if(Path.GetExtension(path.ToUpperInvariant()) == ".PHP") 
{} 

EDIT: Ajout d'une vérification des majuscules/minuscules

+0

Cela semble également retourner false –

+0

Le code que j'ai posté retourne toujours vrai - s'il vous plaît vérifiez si votre chaîne contient vraiment ce que vous avez posté. N'oubliez pas de vérifier le point (".php"). Déboguez ou imprimez l'extension évaluée par la méthode GetExtension() et vérifiez-la. – tanascius

+1

Comme l'a souligné Martin - vérifier les majuscules et minuscules! – tanascius

2

S'il est un fichier existant, vous pouvez obtenir l'objet FileInfo pour et vérifier l'extension de cette façon:

FileInfo fi = new FileInfo(@"D:\development\php\bchat\chat\index.php"); 
if (fi.Exists && fi.Extension == ".php") 
{ 
    //Do something 
} 

Ou je suppose que vous pourriez être un mouton, suivre la foule et utiliser la méthode Path.GetExtension bien mieux que tout le monde a suggéré. Mais posez-vous d'abord cette question: voulez-vous le faire de la manière la plus propre, la plus rapide et la meilleure, ou voulez-vous affirmer votre individualité et me joindre à la voie de la plus grande résistance?

1

Utilisez Path.GetExtension et comparez-le avec le type de fichier que vous recherchez.

1

MISE À JOUR:

Vérifiez ce que path.Substring(path.LastIndexOf('.') retourne en fait - qui pourrait vous orienter dans la bonne direction.

+0

En effet, les solutions présentées dans le Q devraient fonctionner (mais pas le meilleur moyen). Par conséquent, la variable de chemin ne référence pas la valeur attendue. – Richard

1

Assurez-vous qu'il n'y a pas de différence en majuscules/minuscules. Vous testez seulement pour "php" minuscule.

string ext = Path.GetExtension(path); 
bool isPhp = (ext.Equals(".php", StringComparison.InvariantCultureIgnoreCase)); 
2

Juste un échantillon pour la solution affichée:

bool isphp = Path.GetExtension(path) 
       .Equals(".php", StringComparison.InvariantCultureIgnoreCase); 
+0

Renvoie toujours false. –

+0

Serait encore mieux avec StringComparison.OrdinalIgnoreCase. – Richard

1
private static bool IsPhp(string fileName) 
{ 
    return string.Compare(Path.GetExtension(fileName), ".php", 
     StringComparison.OrdinalIgnoreCase) == 0; 
} 
1

Je suppose qu'il y a quelque chose d'étrange dans votre chaîne. Je vous suggère de vider votre chaîne en détail, comme ceci:

foreach (char c in path) 
{ 
    Console.WriteLine("'{0}' U+{1:x4}", c, (int) c); 
} 

De cette façon, vous verrez des personnages inattendus, par exemple unicode char 0s entre les caractères "réels".

Questions connexes