Получение абсолютного пути из относительного в Vista, похоже, не удается с помощью Win32/Shell PathCombine()

Не уверен, является ли это предполагаемым поведением, ошибкой или неправильной функцией, которую я использую, но проблема в том, что PathCombine() возвращает неправильный путь в окне Vista.

Относительный путь (как экспортируется WMP в список воспроизведения):

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

Путь, к которому он относится:

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

и PathCombine() возвращает:

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

однако на самом деле файл находится здесь (судя по проводнику и тому, что из кода я его не могу открыть):

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

Это известная проблема? Есть ли какая-то другая функция, которую я должен использовать?


person dennisV    schedule 09.12.2008    source источник


Ответы (2)


В документации для PathCombine указано, что второй параметр , lpszDir, представляет собой «указатель на заканчивающуюся нулем строку максимальной длины MAX_PATH, содержащую путь к каталогу». Похоже, вы передаете полное имя файла внутри каталога вместо полного имени каталога. Итак, он удаляет три компонента: playlist.wpl, плейлисты и музыку, а затем добавляет остальные.

Вы должны иметь возможность использовать PathRemoveFileSpec для удаления часть файла из вашего пути к каталогу.

person cunkel    schedule 09.12.2008

Когда вы объединяете две строки, вы получаете следующее.

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

Поскольку каждый ".." стирает предыдущий раздел, вы заканчиваете u[p следующей последовательностью:

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

Это потому, что «PathCombine()» не беспокоит, являются ли какие-либо сегменты вашего пути файлами или каталогами. Это просто относительно глупый способ сопоставления специальных навигационных символов (".." и ".") с реальными навигационными сегментами для формирования пути без этих специальных навигационных символов.

Это просто предполагает, что "playlist.wpl" - это имя каталога в вашем случае. Удалите это (или добавьте еще один «..» в начале вашего относительного пути, уловка, позволяющая избежать постороннего кода для удаления раздела имени файла), и все должно работать нормально.

person paxdiablo    schedule 09.12.2008