230 votes

Pourquoi fait Path.Combine ne concaténez pas correctement les noms de fichiers qui commencent par Path.DirectorySeparatorChar

Dans la fenêtre exécution

Il semble qu’elles doivent être les mêmes.

Le vieux FileSystemObject.BuildPath() n’a pas fonctionné de cette façon...

244voto

Kyralessa Points 76456

C'est le genre de question philosophique (qui peut-être que Microsoft peut vraiment répondre), puisque c'est exactement ce que dit la documentation.

Système.IO.Chemin d'accès.Combiner

"Si path2 contient un chemin d'accès absolu, cette méthode retourne path2."

Je ne sais pas ce que la raison est. Je suppose que la solution est d'enlever (ou ajuster) DirectorySeparatorChar depuis le début de la deuxième chemin; peut-être écrire votre propre méthode de combinaison qui le fait et appelle ensuite le Chemin d'accès.Combiner().

25voto

Gulzar Nazim Points 35342

C’est le code désassemblé du réflecteur pour Path.Combine, méthode. Vérifiez le bon fonctionnement IsPathRooted. Si la deuxième voie est enracinée (commence par un DirectorySeparatorChar), retour deuxième voie comme il est.

24voto

Wedge Points 11910

À mon avis c'est un bug. Le problème, c'est qu'il y a deux types différents de "absolue" des chemins. Le chemin d'accès "d:\mydir\myfile.txt" est absolue, le chemin "\mydir\myfile.txt" est également considéré comme "absolue", même si il est absent de la lettre de lecteur. Le comportement correct, à mon avis, serait de la faire précéder de la lettre de lecteur de la première chemin d'accès lors de la deuxième chemin commence avec le séparateur de répertoire (et n'est pas un chemin d'accès UNC). Je recommande d'écrire votre propre helper de fonction wrapper qui a le comportement que vous désirez si vous en avez besoin.

6voto

elarson Points 173

Ne connaissant pas les détails réels, ma conjecture est qu’il fait une tentative pour rejoindre comme vous pourriez rejoindre URI relatifs. Par exemple :

Cela signifie que lorsque vous rejoignez un chemin avec une barre oblique qui précède, vous réellement joignez une base à l’autre, auquel cas la deuxième priorité devient.

5voto

Carlos Osuna Points 51

J’ai essayé ce code :

et a obtenu :

Il serait utile que je pourrais obtenir

Au lieu de cela

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X