MSDN文档建议不要在多线程应用程序和共享库中同时使用GetFullPathName()
-不幸的是,我正在构建多线程共享库。
具体来说,我正在寻求转换双点组件,以便给定当前目录"C:\FolderA\FolderB\FolderC"
,路径"..\..\FolderX\FolderY"
将产生"C:\FolderX\FolderY"
。
尽管我可以从头开始写一个,但我希望找到一个更快的解决方案,并且,一个已经尝试和测试过的解决方案。
修改
查看规格后,我可以要求调用者指定一个基本文件夹,而不是依赖当前目录。但是,我仍然必须转换双点,这是我要避免的事情。
请注意,除非算法可以完全复制到最终解决方案中,否则项目要求不包括第三方库,例如Boost和QT。
答案 0 :(得分:4)
GetFullPathName
导致其线程不安全的问题是它依赖于当前目录。
因此,您需要使用PathCombine
(或改进的版本,例如PathCchCombineEx
)并自己传递一些内容而不是当前目录。
答案 1 :(得分:2)
如评论中所述,GetFullPathName
的非建议多线程警告源于以下事实:当前目录是该进程的全局属性,并且如果在没有同步的情况下对其进行更改是相对的路径失去意义。并不是说提供的API对此很懒,并且GetFullPathName
的替代实现可以以任何方式为您节省-它是在多线程环境中被设计打破的相对路径(如果更改了当前路径)。>
长话短说: 这不是您可以保护自己的东西 ,只需使用GetFullPathName
1 。如果您的库客户端为您传递了一条相对路径,那么就隐含地承诺它不会同时更改当前路径,因为这会使传递给您的路径完全没有意义。如果您以其他任何方式使用该路径(包括打开路径),也会遇到完全相同的问题。