String.concat ou Path.Combine ? [Résolu]

Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Dernière intervention
14 février 2011
- - Dernière réponse : cs_coq
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 12 mars 2008 à 19:23
Bonjour a tout le monde,








voici une question qui me turlupine depuis un moment et donc je ne trouve rien sur le forum.

Quelle est la différence entre "string.Concat" et "Path.Combine".
Mise à part que Path.Combine gère les "".
Je pose cette question, car il m'arrive de devoir employer
"string.concat" plutôt que "Path.combine" lors de concaténation
d'un Path source avec le nom d'un fichier.


Dernièrement j'ai eu ce problème sur cette ligne:



//Ne fonctionne pas
destination = Path.Combine(destination.Substring(0,
y), sousdossiers.FullName.Substring(x)); 





//fonctionne
destination = string.Concat(destination.Substring(0,
y), sousdossiers.FullName.Substring(x)); 





cela ce résume en : destination = @"C:\abc\def" +
@"\ghi\yxz.ext"; 






Quelqu'un aurait-il une réponse ?


L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès.
Loi de Murphy.


<!--
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
3
Merci
Winnie> Je pense que normalement, un path d'un répertoire doit toujour se terminer par un "" ou "/".
C'est pour ça que si tu fais


string

x =


Path

.Combine(


@"C:\abc\def"

,


@"\ghi\yxz.ext"

);

Ca ne marche pas correctement...

<hr />
-My Blog-

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 104 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
String.Concat concatène des objets sans autre traitement... alors que Path.Combine vérifie le type de path (/ ou \), vérifie si la première chaine se termine par un / (ou \)...

pas vraiment la même chose

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Dernière intervention
14 février 2011
0
Merci
Merci pour ta réponse sebmafate,
mais qu'set ce qui se passe si ma première chaine ne comporte pas de \ ?
car ma seconde question est pourquoi je dois utiliser le string.concat plutôt que le path.combine pour réaliser mon path ?

L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès.
Loi de Murphy.<!--
Commenter la réponse de winny68
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
pour construire un path, il faut utiliser Path.Combine...

ex :

string a = @"c:\temp";
string b = "titi.png";

string.Concat(a, b) --> c:\temptiti.png
Path.Combine(a, b) --> c:\temp\titi.png

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Dernière intervention
14 février 2011
0
Merci
Merci Bidou, ça c'est une réponse claire comme je l'ai aime.

donc, si j'ai bien compris, je dévrai faire :
destination = Path.Combine(string.concat(path1,@""), path2);

Cela, pour être certain d'avoir un bon path.
cepandant, je sais que Path.combine change @"\" en @"", mais est ce qu'il change aussi @"\\" en @"".
après je peux faire des tests, mais si vous savez.

Merci

L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès.
Loi de Murphy.<!--
Commenter la réponse de winny68
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
A vrai dire, je trouve étonnant le comportement de cette fonction... et je n'ai pas de solution à proposer "à froid" si ce n'est de tester le dernier caractère du string (mais c'est justement pas le but, la fonction est là pour ça...).

Discussion sur le sujet: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=183066&SiteID=1http://www.bokebb.com/dev/english/1936/posts/19369225.shtml

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Dernière intervention
14 février 2011
0
Merci
C'est vrai, mais si ma première string n'a pas de "", elle n'est pas prise en compte.
je pense quelle a des limites.

Merci pour toutes vos réponses.

L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès.
Loi de Murphy.<!--
Commenter la réponse de winny68
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
Voici le code de la méthode Combine :

publicstaticblog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
ooops...

public static string Combine(string path1, string path2)
{    if ((path1 null) || (path2 null))
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    CheckInvalidPathChars(path1);
    CheckInvalidPathChars(path2);
    if (path2.Length == 0)
    {
        return path1;
    }
    if (path1.Length == 0)
    {
        return path2;
    }
    if (IsPathRooted(path2))
    {
        return path2;
    }
    char ch = path1[path1.Length - 1];
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar))
    {
        return (path1 + DirectorySeparatorChar + path2);
    }
    return (path1 + path2);
}


 

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
donc... on voit bien que la méthode teste si path1 se termine par le séparateur \, si oui retourne path1 + path2, sinon path1 + \ + path2.

Par contre, il n'y a aucun test concernant path2

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
L'exemple cité ci-dessus ne fonctionne tout de même pas...

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
ce qui gène dans l'exemple c'est le \ au début du path2... la fonction n'est pas prévue (c'est très con, je sais) pour ça.
Quand on le sait, on fait attention ;)

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Bizarre parfois, et en plus ça n'a pas été corrigé dans le framework 3.5...
Si y'a une logique, je ne la vois pas !

<hr />
-My Blog-
Commenter la réponse de cs_Bidou
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
hum... it's not a bug... it's a feature

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Salut,

Personnellement le fait que le \ghi dérange Path.Combine ne me choque pas plus que ça, vu qu'au final "ghi\file.txt" est un chemin relatif alors que "\ghi\file.txt" va être considéré comme chemin absolu, de mémoire "\ghi\file.txt" étant directement équivalent à "<répertoire racine du répertoire courant>\ghi\file.txt"

En clair, si le répertoire courant est "C:\toto\titi"
"\ghi\file.txt" équivaut à "C:\ghi\file.txt"
"ghi\file.txt" équivaut à "C:\toto\titi\ghi\file.txt"

En clair, si le répertoire courant est "D:\toto"
"\ghi\file.txt" équivaut à "D:\ghi\file.txt"
"ghi\file.txt" équivaut à "D:\toto\ghi\file.txt"

Bref, "\ghi\file.txt" != "ghi\file.txt" ;-)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
99
Date d'inscription
vendredi 25 avril 2003
Dernière intervention
14 février 2011
0
Merci
Merci à vous tous,

j'ai lu la métode Combine.
je suis surpris qu'on nous fournisse des méthodes qui sont testées à moitées.

Mais bon, j'ai eu de bonne réponse.

Merci.
+

L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès.
Loi de Murphy.<!--
Commenter la réponse de winny68
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Pas besoin d'être surpris vu que ce n'est pas le cas, cette méthode à le comportement annoncé par sa documentation :
"Si path2 contient un chemin d'accès absolu, cette méthode retourne path2."

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.