L'obtention du chemin absolu d'un relatif dans Vista semble échouer avec Win32 / Shell PathCombine ()

StackOverflow https://stackoverflow.com/questions/351479

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top