调用boost::filesystem::unique_path可能会失败

假如你的程序需要在指定目录下生成一个唯一的临时文件,而且恰好引入了boost库,那么你可能会选择使用boost::filesystem::unique_path来生成文件名,因为该函数似乎正是为了此目的而生的。但是要小心,该函数在某些环境下可能会失败,抛出“拒绝访问”的异常。

这里失败的原因并不是由于访问文件系统导致的,而是由于访问了Windows中与密码学相关的API。查看unique_path的源码,可以发现它内部调用了CryptAcquireContext和CryptGenRandom来生成随机数据,然后基于这些随机数据来生成文件名。由于未知的原因,在某些Windows系统上需要管理员权限才能成功调用CryptAcquireContext(正常情况下并不需要管理员权限),从而导致了unique_path失败。

所以,为了避免不必要的麻烦,直接使用GUID或者其它唯一性强的标识作为临时文件名即可。只有在涉及安全问题的情况下才应该考虑使用unique_path——此时就需要弄清楚为什么需要管理员权限才能调用CryptAcquireContext了。