Как удалить квалификаторы каталога, чтобы упростить путь с помощью Win32 API?

Если у вас есть путь типа «C:\foo\.\bar\..», есть ли простой способ с помощью Win32 API удалить квалификаторы каталога, чтобы упростить его до «C:\foo»?


Обновление: кажется, это более сложная проблема. В этом простом примере "C:\foo\.\bar\.." он работает как с PathCanonicalize(), так и с GetFullPathName(), чтобы в результате получить "C:\foo".

Однако путь, по которому я прохожу, имеет символическую ссылку. Допустим, я передаю «C:\NaNa\Boo\Bin\..», а «C:\NaNa» — это ссылка на «D:\Apple». Затем я получаю "C:\NaNa\Boo\Bin\.." вместо "C:\NaNa\Boo"

Я бы предположил, что функции работают только со строками, но, похоже, есть разница при использовании символической ссылки :-(


Обновление № 2: похоже, в переданной строке был символ разрыва строки (0x0d), и это мешало функции работать должным образом!


person Adisak    schedule 06.07.2011    source источник
comment
Я хочу извиниться перед человеком, который отправил GetFullPathName() в качестве ответа, когда я прокомментировал, что это не сработало (и они удалили свой ответ). Это действительно работает с правильно отформатированной строкой. По крайней мере, я только прокомментировал, а не проголосовал против, но я все еще чувствую, что извинения оправданы.   -  person Adisak    schedule 07.07.2011


Ответы (1)


Взгляните на PathCanonicalize() shlwapi.

person Alex K.    schedule 06.07.2011
comment
По какой-то причине на моей машине (Windows 7) PathCanonicalize() не удаляет завершающий .. - любопытно, потому что в документах подразумевается, что это должно быть сделано. - person Adisak; 06.07.2011
comment
Странно, у меня работает на xp, buffer_5[]example @ msdn показывает трейлинг .. раздевается - person Alex K.; 06.07.2011
comment
Хм, это работает для c:\foo\.\bar\.. -- просто не работает для моего более длинного имени каталога. - person Adisak; 06.07.2011
comment
FWIW, GetFullPathName() работает и для примера c:\foo\.\bar\.. Однако для моего реального примера я использую путь с символической ссылкой. - person Adisak; 06.07.2011
comment
Проблема оказалась в плохом символе во входной строке. Спасибо за помощь. - person Adisak; 07.07.2011