多线程应用程序中的SetCurrentDirectory

时间:2009-06-30 07:52:01

标签: c++ windows multithreading winapi visual-c++

我理解SetCurrentDirectory不应该在多线程应用程序中使用,因为当前目录在进程中的所有线程之间共享。

设置目录时考虑到这一点的最佳方法是什么。 通过在打开文件时包含完整路径名而不是先使用SetCurrentDirectory导航到它们,可以避免设置目录,但这是唯一的解决方案吗?

3 个答案:

答案 0 :(得分:7)

之前我遇到过这个问题。

任何需要当前目录概念来支持相对路径或搜索的对象(例如构建工具)都有一个成员属性,它以“当前”路径维护,然后构建打开/创建/搜索的完整路径

在应用程序的加载阶段,可以检索一次CurrentPath的初始值,例如: main(),WinMain(),DllInit()等通过GetCurrentDirectory存储在全局中。之后,Win32版本将被忽略。

OPENFILENAME结构有一个初始目录成员,因此文件打开/保存对话框不必使用Win32当前目录。

答案 1 :(得分:1)

每个进程都有一个当前目录,因此如果您希望进程中的每个线程使用不同的当前目录,我认为您应该在每个目录中指定完整路径。

答案 2 :(得分:1)

建议在需要时将常规路径和本地路径中的完整路径仅作为例外(并且非常小心)。即OpenFile对话框可能会也可能不会更改当前目录(取决于属性)等。使用文件名或本地路径可能会导致问题。

根据我的经验,完整路径不会显着降低文件访问速度。我写了一个应用程序,每分钟打开数千个文件,并将分类数据写入其他数千个文件 - 所有文件都使用完整路径,所有文件都安装在Windows安装的网络驱动器上。那里的瓶颈就是关闭文件。不打开它们。