L'obtention du chemin absolu d'un relatif dans Vista semble échouer avec Win32 / Shell PathCombine ()
-
20-08-2019 - |
Question
Je ne suis pas sûr qu'il s'agisse d'un comportement ou d'un bug ou d'une fonction incorrecte que j'utilise, mais le problème est que PathCombine () renvoie un chemin incorrect sur une boîte Vista.
Le chemin relatif est (exporté par le WMP vers une liste de lecture):
..\..\..\Public\Music\Sample Music\Amanda.wma
Le chemin auquel il est relatif est:
C:\Users\userX\Music\Playlists\playlist.wpl
et PathCombine () renvoie:
C:\Users\userX\Public\Music\Sample Music\Amanda.wma
Cependant, le fichier se trouve réellement ici (à en juger par l'explorateur et le fait que je ne peux pas l'ouvrir à partir du code):
C:\Users\Public\Music\Sample Music\Amanda.wma
Est-ce un problème connu? Existe-t-il une autre fonction que je devrais utiliser?
La solution
La documentation sur PathCombine indique que le deuxième paramètre, lpszDir , est & "; un pointeur sur une chaîne terminée par un caractère NULL de longueur maximale MAX_PATH contenant le chemin du répertoire. &"; Vous semblez transmettre le nom qualifié complet d'un fichier à l'intérieur du répertoire au lieu du nom qualifié complet du répertoire. Ainsi, il supprime trois composants: playlist.wpl, Playlists et Music, puis ajoute le reste.
Vous devriez pouvoir utiliser PathRemoveFileSpec pour supprimer la partie du fichier de votre chemin de répertoire.
Autres conseils
Lorsque vous combinez vos deux chaînes, vous obtenez ce qui suit.
C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
Depuis chaque " ..
" effacera la section précédente, vous finirez par u [p avec la séquence suivante:
C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\Playlists\..\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Music\..\Public\Music\Sample Music\Amanda.wma
C:\Users\userX\Public\Music\Sample Music\Amanda.wma
C'est parce que " PathCombine()
" n'est pas gêné par le fait que des segments de votre chemin soient des fichiers ou des répertoires. C'est juste un moyen relativement stupide de faire correspondre des caractères de navigation spéciaux (& "; .
&" Et & "; playlist.wpl
&";) À des segments de navigation réels pour former un chemin sans ceux-ci. caractères de navigation spéciaux.
On suppose simplement que " <=> " est un nom de répertoire dans votre cas. Dénudez-le (ou ajoutez-y un autre & "; <=> &" Au début de votre chemin relatif, une astuce permettant d'éviter le code inutile pour supprimer la section de nom de fichier) et cela devrait fonctionner normalement.