有线程安全的GetFullPathName版本吗?

时间:2019-02-21 18:43:49

标签: c++ winapi

MSDN文档建议不要在多线程应用程序和共享库中同时使用GetFullPathName()-不幸的是,我正在构建多线程共享库。

具体来说,我正在寻求转换双点组件,以便给定当前目录"C:\FolderA\FolderB\FolderC",路径"..\..\FolderX\FolderY"将产生"C:\FolderX\FolderY"

尽管我可以从头开始写一个,但我希望找到一个更快的解决方案,并且,一个已经尝试和测试过的解决方案。

修改

查看规格后,我可以要求调用者指定一个基本文件夹,而不是依赖当前目录。但是,我仍然必须转换双点,这是我要避免的事情。

请注意,除非算法可以完全复制到最终解决方案中,否则项目要求不包括第三方库,例如Boost和QT。

2 个答案:

答案 0 :(得分:4)

GetFullPathName导致其线程不安全的问题是它依赖于当前目录。

因此,您需要使用PathCombine(或改进的版本,例如PathCchCombineEx)并自己传递一些内容而不是当前目录。

答案 1 :(得分:2)

如评论中所述,GetFullPathName的非建议多线程警告源于以下事实:当前目录是该进程的全局属性,并且如果在没有同步的情况下对其进行更改是相对的路径失去意义。并不是说提供的API对此很懒,并且GetFullPathName的替代实现可以以任何方式为您节省-它是在多线程环境中被设计打破的相对路径(如果更改了当前路径)。

长话短说: 这不是您可以保护自己的东西 ,只需使用GetFullPathName 1 。如果您的库客户端为您传递了一条相对路径,那么就隐含地承诺它不会同时更改当前路径,因为这会使传递给您的路径完全没有意义。如果您以其他任何方式使用该路径(包括打开路径),也会遇到完全相同的问题。


  1. 如果需要的话。通常,越多的应用程序仅将路径作为不透明的Blob传递,接收有效但“异国”的路径时它们破坏的次数就越少。