2008-12-09 6 views
1

Vous ne savez pas si c'est un comportement prévu ou un bogue ou une mauvaise fonction que j'utilise, mais le problème est que PathCombine() retourne un mauvais chemin sur une boîte de Vista.Obtenir le chemin absolu à partir de parent dans Vista semble échouer en utilisant Win32/Shell PathCombine()

Le chemin relatif est (comme exportée par le WMP à une liste de lecture):

..\..\..\Public\Music\Sample Music\Amanda.wma

Le chemin il est par rapport à est:

C:\Users\userX\Music\Playlists\playlist.wpl

et renvoie PathCombine():

C:\Users\userX\Public\Music\Sample Music\Amanda.wma

cependant, le fichier est en fait situé 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? Y a-t-il une autre fonction que je devrais utiliser?

Répondre

3

Le documentation for PathCombine spécifie que le second paramètre, lpszDir, est « un pointeur vers une chaîne à zéro terminal de MAX_PATH de longueur maximale qui contient le chemin de répertoire. » Vous semblez passer le nom qualifié complet d'un fichier dans le 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 devez pouvoir utiliser PathRemoveFileSpec pour supprimer le fichier de votre chemin de répertoire. Lorsque vous combinez vos deux chaînes, vous obtenez ce qui suit:

+0

Hmm, je vais essayer - merci. – dennisV

+0

Oui, cela fonctionne maintenant - merci. – dennisV

2

C:\Users\userX\Music\Playlists\playlist.wpl\..\..\..\Public\Music\Sample Music\Amanda.wma 

Puisque chaque « .. » effacera la section précédente, vous finissez 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() » est pas pris la peine par le fait que tous les segments de votre chemin sont des fichiers ou des répertoires. C'est juste une façon relativement stupide de faire correspondre des caractères de navigation spéciaux (".." et ".") avec des segments de navigation réels pour former un chemin sans ces caractères de navigation spéciaux.

En supposant simplement que "playlist.wpl" est un nom de répertoire dans votre cas. Décochez-le (ou ajoutez un autre ".." au début de votre chemin relatif, une astuce pour éviter d'extraire le code pour déshabiller la section du nom de fichier) et cela devrait fonctionner.

Questions connexes