À partir de la fenêtre d'exécution dans Visual Studio:
> Path.Combine(@"C:\x", "y")
"C:\\x\\y"
> Path.Combine(@"C:\x", @"\y")
"\\y"
Il semble que les deux devraient être identiques.
L'ancien FileSystemObject.BuildPath () ne fonctionnait pas de cette façon ...
Path.Combine()
est principalement destiné à la rétrocompatibilité (avec le comportement existant). Vous feriez mieux d'utiliserPath.Join()
: "Contrairement à la méthode Combine, la méthode Join ne tente pas de rooter le chemin renvoyé. (Autrement dit, si path2 est un chemin absolu, la méthode Join ne rejette pas path1 et renvoie path2 comme Combine method does.) "Réponses:
C'est une sorte de question philosophique (à laquelle seul Microsoft peut peut-être vraiment répondre), car il fait exactement ce que dit la documentation.
System.IO.Path.Combine
"Si chemin2 contient un chemin absolu, cette méthode renvoie chemin2."
Voici la méthode Combine réelle de la source .NET. Vous pouvez voir qu'il appelle CombineNoChecks , qui appelle ensuite IsPathRooted sur path2 et renvoie ce chemin si tel est le cas:
Je ne sais pas quelle est la justification. Je suppose que la solution est de supprimer (ou de couper) DirectorySeparatorChar depuis le début du deuxième chemin; écrivez peut-être votre propre méthode Combine qui fait cela, puis appelez Path.Combine ().
la source
cd (component)
depuis la ligne de commande. Cela me semble raisonnable.Path.Combine
juste pour être sûr, mais ensuite il s'est cassé .. C'est tellement stupide :)Il s'agit du code désassemblé de la méthode .NET Reflector for Path.Combine. Vérifiez la fonction IsPathRooted. Si le deuxième chemin est enraciné (commence par un DirectorySeparatorChar), retournez le deuxième chemin tel quel.
la source
Je voulais résoudre ce problème:
Bien sûr, tous les chemins 1 à 9 doivent contenir une chaîne équivalente à la fin. Voici la méthode PathCombine que j'ai proposée:
Je pense aussi que c'est assez ennuyeux que cette manipulation des cordes doive être faite manuellement, et je serais intéressé par la raison derrière cela.
la source
À mon avis, c'est un bug. Le problème est qu'il existe deux types différents de chemins "absolus". Le chemin "d: \ mydir \ myfile.txt" est absolu, le chemin "\ mydir \ myfile.txt" est également considéré comme "absolu" même s'il manque la lettre de lecteur. Le comportement correct, à mon avis, serait de préfixer la lettre de lecteur du premier chemin lorsque le deuxième chemin commence par le séparateur de répertoire (et n'est pas un chemin UNC). Je recommanderais d'écrire votre propre fonction de wrapper d'assistance qui a le comportement que vous désirez si vous en avez besoin.
la source
Path.Combine
) et le langage C #.Depuis MSDN :
Dans votre exemple, path2 est absolu.
la source
Suite aux conseils de Christian Graus dans son blog "Things I Hate about Microsoft" intitulé " Path.Combine is essentiellement inutile. ", Voici ma solution:
Certains conseillent que les espaces de noms doivent entrer en collision, ... Je suis allé avec
Pathy
, comme un léger, et pour éviter une collision d'espace de noms avecSystem.IO.Path
.Edit : Ajout de vérifications de paramètres nuls
la source
Ce code devrait faire l'affaire:
la source
Ne connaissant pas les détails réels, je suppose que cela tente de se joindre comme si vous pouviez rejoindre des URI relatifs. Par exemple:
Cela signifie que lorsque vous joignez un chemin avec une barre oblique précédente, vous joignez en fait une base à une autre, auquel cas la seconde a la priorité.
la source
Raison:
Votre deuxième URL est considérée comme un chemin absolu, la
Combine
méthode ne retournera le dernier chemin que si le dernier chemin est un chemin absolu.Solution: supprimez simplement la barre oblique
/
de départ de votre deuxième chemin (/SecondPath
versSecondPath
). Ensuite, cela fonctionne comme vous l'avez excepté.la source
Cela a du sens, d'une certaine manière, compte tenu de la façon dont les chemins (relatifs) sont généralement traités:
La vraie question est: pourquoi les chemins, qui commencent par
"\"
, sont-ils considérés comme «enracinés»? C'était nouveau pour moi aussi, mais cela fonctionne de cette façon sous Windows :la source
Si vous souhaitez combiner les deux chemins sans perdre aucun chemin, vous pouvez utiliser ceci:
Ou avec des variables:
Les deux cas renvoient "C: \ test \ test".
Tout d'abord, j'évalue si Path2 commence par / et si c'est vrai, renvoie Path2 sans le premier caractère. Sinon, renvoyez le chemin complet2.
la source
== @"\"
chèque par unPath.IsRooted()
appel car ce"\"
n'est pas le seul caractère à prendre en compte.Ces deux méthodes devraient vous éviter de joindre accidentellement deux chaînes contenant toutes les deux le délimiteur.
la source
Cela signifie "le répertoire racine du lecteur actuel". Dans votre exemple, cela signifie le dossier "test" dans le répertoire racine du lecteur actuel. Donc, cela peut être égal à "c: \ test".
la source
Supprimez la barre oblique de départ ('\') dans le deuxième paramètre (path2) de Path.Combine.
la source
J'ai utilisé la fonction d'agrégation pour forcer la combinaison des chemins comme ci-dessous:
la source
Comme l'a mentionné Ryan, il fait exactement ce que dit la documentation.
A partir de l'heure DOS, le disque actuel et le chemin actuel sont distingués.
\
est le chemin racine, mais pour le DISQUE ACTUEL.Pour chaque " disque ", il existe un " chemin actuel " séparé . Si vous changez le disque en utilisant
cd D:
vous ne changez pas le chemin actuel enD:\
, mais en: "D: \ peu importe \ était \ le \ dernier \ chemin \ consulté \ sur \ ce \ disque" ...Ainsi, dans Windows, un littéral
@"\x"
signifie: "CURRENTDISK: \ x". A doncPath.Combine(@"C:\x", @"\y")
comme deuxième paramètre un chemin racine, pas un chemin relatif, mais pas dans un disque connu ... Et comme on ne sait pas quel pourrait être le «disque courant», python retourne"\\y"
.la source