Существует ли поточно-безопасная версия GetFullPathName? - PullRequest
0 голосов
/ 21 февраля 2019

В документации MSDN не рекомендуется использовать GetFullPathName() как в многопоточных приложениях, так и в общих библиотеках - к сожалению, я создаю многопоточную разделяемую библиотеку.

В частности, я хочу преобразовать double-dot компоненты, такие, что при текущем каталоге "C:\FolderA\FolderB\FolderC" путь "..\..\FolderX\FolderY" даст "C:\FolderX\FolderY".

Хотя я могу написать один с нуля, я надеюсь найти более быстрое решение,и тот, который уже опробован и протестирован.

Редактировать

После просмотра моих спецификаций я могу потребовать от вызывающей стороны указать базовую папку, а не полагаться на текущуюкаталог.Однако мне все равно придется преобразовывать двойные точки, чего я и стараюсь избегать.

Обратите внимание, что требования проекта исключают сторонние библиотеки, такие как Boost и QT, если толькоАлгоритм может быть полностью скопирован в окончательное решение.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Как объяснено в комментариях, предупреждение "Не рекомендуется для многопоточности" GetFullPathName проистекает из того факта, что текущий каталог является свойством, глобальным для процесса, и если вы измените его без синхронизации, относительные пути будут потеряны.имея в виду.Не то, чтобы предоставляемый API ленился по этому поводу, и альтернативная реализация GetFullPathName могла бы вас спасти любым способом - это относительные пути, которые нарушаются проектом (если текущий путь изменен) в многопоточной среде.

Короче говоря: это не то, от чего вы можете защитить себя , просто используйте GetFullPathName 1 .Если ваш библиотечный клиент передает вам относительный путь, то он неявно обещает, что тем временем он не изменит текущий путь, поскольку сделает путь, который он вам передал, совершенно бессмысленным;у вас возникла бы точно такая же проблема, если бы вы использовали этот путь любым другим способом (включая его открытие).


  1. Если вам нужно.Как правило, чем больше приложений просто передают пути в виде непрозрачных BLOB-объектов, тем меньше они ломаются при получении действительных, но «экзотических» путей.
0 голосов
/ 21 февраля 2019

Проблема с GetFullPathName, которая делает его небезопасным, заключается в том, что он опирается на текущий каталог.

Поэтому вам нужно использовать PathCombine (или улучшенную версию, например PathCchCombineEx) и вместо этого передавать что-тосамого текущего каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...