Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

CoqBlog

.NET is good :-)
{ Blog de Gaël Covain }

Actualités

Path.Combine : "Rep1\Rep2\File.ext" != "\Rep1\Rep2\File.ext"

Certains s'étonnent devant le retour de la méthode Path.Combine pour le code suivant :

String path1 = @"C:\Rep0";
String path2 = @"\Rep1\Rep2\File.ext";
String path = Path.Combine(path1, path2);

En effet, path contiendra "\Rep1\Rep2\File.ext" alors que certains s'attendent à avoir "C:\Rep0\Rep1\Rep2\File.ext".

Pourquoi alors qu'on nous répète si souvent qu'un des avantages d'utiliser Path.Combine est de s'affranchir de la vérification manuelle de l'existence ou non d'un \ en fin de chemin de répertoire, les codes suivants ne retournent pas tous la même chose : "C:\Rep0\Rep1\Rep2\File.ext" ?

String path1;
String path2;
String path;

path1 = @"C:\Rep0";
path2 = @"\Rep1\Rep2\File.ext";
path = Path.Combine(path1, path2); // \Rep1\Rep2\File.ext

path1 = @"C:\Rep0";
path2 = @"Rep1\Rep2\File.ext";
path = Path.Combine(path1, path2); // C:\Rep0\Rep1\Rep2\File.ext

path1 = @"C:\Rep0\";
path2 = @"\Rep1\Rep2\File.ext";
path = Path.Combine(path1, path2); // \Rep1\Rep2\File.ext

path1 = @"C:\Rep0\";
path2 = @"Rep1\Rep2\File.ext";
path = Path.Combine(path1, path2); // C:\Rep0\Rep1\Rep2\File.ext

 

Ce comportement est conforme à ce qui est annoncé dans la documentation de Path.Combine :

"[...]Si path2 inclut une racine, path2 est retourné.[...]" / "[...]If path2 includes a root, path2 is returned.[...]"

 

Donc "\Rep1\Rep2\File.ext" est considéré comme possédant une racine ? Il s'agit donc d'un chemin absolu ?
Personnellement je le considère plutôt comme étant à mi chemin entre le chemin relatif et le chemin absolu : là où "Rep1\Rep2\File.ext" est relatif au répertoire courant, "\Rep1\Rep2\File.ext" est en fait relatif à la racine du répertoire courant.
Même si on ne l'est que de la racine, on reste dépendant du répertoire courant.

Exemple, si le répertoire courant est "C:\Rep0", le chemin complet (voir Path.GetFullPath ou directement GetFullPathName / GetFullPathNameTransacted) de

  • "Rep1\Rep2\File.ext" est "C:\Rep0\Rep1\Rep2\File.ext"
  • "\Rep1\Rep2\File.ext" est "C:\Rep1\Rep2\File.ext"

Mais dans les faits, il ne s'agit pas d'un chemin relatif, comme le spécifie la section "Relative Paths" de cette page de la documentation :

"[...]A file name is relative to the current directory if it does not begin with one of the following:

  • A drive name, which is either a drive letter followed by a colon, or a UNC name.
  • A directory name separator (backslash), for example, \subdirectory).

[...]"

 

Ce type de chemin est d'ailleurs tout à fait utilisable directement avec SetCurrentDirectory, et la documentation de GetCurrentDirectory aborde elle aussi le sujet :

"In certain rare cases, if the specified directory is on the current drive, the function might omit the drive letter and colon from the path. Therefore, the size that is returned by the function might be two characters less than the size of the specified string, not including the terminating null character. This behavior might occur in edge situations such as in a services application. If you need the drive letter, make a subsequent call to GetFullPathName to retrieve the drive letter."

Au passage si quelqu'un sait comment reproduire ce comportement sur GetCurrentDirectory, je prends.

 

Vous l'utilisez aussi probablement dans cmd ou PowerShell si vous voulez positionner le répertoire courant à la racine : vous tapez "cd \", pas "cd C:\".

 

Bref, je résume : "Rep1\Rep2\File.ext" != "\Rep1\Rep2\File.ext"

 

Naming a File (Windows)
Path.Combine Method (System.IO)
Path.GetFullPath Method (System.IO)
GetFullPathName Function (Windows) / GetFullPathNameTransacted Function (Windows)
GetCurrentDirectory Function (Windows)
SetCurrentDirectory Function (Windows)

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: lundi 24 mars 2008 14:40 par coq
Classé sous : , ,

Commentaires

brunews a dit :

En C directement:

char buf[264];

PathCombine(buf, szPthA, szPthB);

MessageBox(0, buf, szappname, 0);

POUR:

szPthA : "C:\Rep0";

szPthB[] : "\Rep1\Rep2\File.ext";

ON OBTIENT: C:\Rep1\Rep2\File.ext

POUR:

szPthA : "C:\Rep0";

szPthB[] : "Rep1\Rep2\File.ext";

ON OBTIENT: C:\Rep0\Rep1\Rep2\File.ext

Le 1er exemple ne donne pas le même résultat que .NET, il ne faut donc pas chercher l'explication d'un résultat .NET dans la doc API du système.

A noter aussi que le répertoire courant n'entre vraiment pour rien dans l'affaire.

PathCombine() fait partie de ces fonctions inutiles et donc nuisibles qu'il convient d'éviter.

# mars 24, 2008 19:41

mdislaire a dit :

Mince alors, va falloir que je vérifie ça maintenant. C'est malin...

Sinon tu peux regarder cette classe : https://svn.berlios.de/wsvn/serverlight/trunk/src/PathHelper.cs

Elle va peut être t'intéresser.

# mars 28, 2008 00:30

coq a dit :

Yep, si ça te tente tu peux aussi jeter un oeil au projet FileDirectoryPath de Patrick Smacchia : http://www.codeplex.com/FileDirectoryPath

# mars 29, 2008 12:25

mdislaire a dit :

Wah, Désolé pour le temps de réaction. Mince, comment j'ai pu passer a cotés de ça!!! Terrible. De Patrick Smacchia en plus... pauvre fan que je suis. Je me déçois... :-)

# mai 26, 2008 01:58

coq a dit :

Lol, y'a pas de mal :p

# mai 30, 2008 20:50
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [PowerShell 3] Télécharger et installer la documentation en ligne par Blog de SPBrouillet (Pierrick BROUILLET) le il y a 18 heures et 13 minutes

- [#SharePoint 2010][#SQLServer 2012] AlwaysOn pour SharePoint (1/4) : Configuration (1ère partie)… par Le blog de Patrick [MVP SharePoint] le il y a 23 heures et 39 minutes

- Job Day @MIC Brussels - .Net Developers on Mobile applications par Le Blog (Vert) d'Arnaud JUND le 05-15-2012, 20:26

- [SharePoint 2010] – SharePoint 2010, Windows (Server) 8 et des erreurs IIS sont dans une VM… par Blog de SPBrouillet (Pierrick BROUILLET) le 05-14-2012, 12:10

- [Event] Windows Azure dev Camp le 20 juin! par Fathi Bellahcene le 05-13-2012, 09:29

- Comment redimensionner une image avec WinRT : plusieurs solutions par Richard Clark le 05-11-2012, 15:43

- Event : Swiss SharePoint Club Meeting #20 à Yverdon par Blog Technique de Romelard Fabrice le 05-11-2012, 15:24

- Réflechissons un peu ce matin à propos des ORM par Richard Clark le 05-11-2012, 08:48

- #SharePoint Solutions Roadshow le 5 juin à Issy ! par Le blog de Patrick [MVP SharePoint] le 05-09-2012, 15:10

- SharePoint : Mes alertes ne marchent pas … Que faire ? Comment réparer ou agir ? par The Mit's Blog le 05-08-2012, 14:59