2009-06-30 95 views
4

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

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

回答

7

我以前遇到过这个问题。

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

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

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

1

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

1

建议在一般情况下使用完整路径,本地路径仅在需要时作为例外(并非常谨慎)。即OpenFile对话框可能会改变或不改变当前目录(取决于属性)等。使用文件名或本地路径是导致问题的一个潜在原因。

根据我的经验,完整路径不会显着减慢文件访问速度。我编写了一个应用程序,可以每分钟打开数千个文件,并将有序数据写入其他数千个文件 - 全部使用完整路径,全部使用Windows安装的网络驱动器。那里的瓶颈正在关闭文件。不打开它们。