2009-06-30 3 views
4

Я понимаю, что SetCurrentDirectory не должен использоваться в многопоточном приложении, поскольку текущий каталог разделяется между всеми потоками процесса.SetCurrentDirectory в многопоточном приложении

Каков наилучший подход к настройке каталога с учетом этого. В большинстве случаев можно избежать установки каталога путем включения полного пути при открытии файлов вместо того, чтобы сначала перейти к ним с помощью SetCurrentDirectory, но это единственное решение?

ответ

7

Я столкнулся с этой проблемой раньше.

Любой объект, который нуждается в концепции текущего каталога для поддержки относительных путей или поиска (например, инструмент построения), имеет свойство-член, которое он поддерживает с его «текущим» путем, а затем создает полный путь для открытия/создания/поиск.

Начальное значение для CurrentPath может быть получено один раз во время фазы загрузки приложения, например. main(), WinMain(), DllInit() и т. д. через GetCurrentDirectory и хранится в глобальной сети. После этого версия Win32 игнорируется.

Структура OPENFILENAME имеет начальный элемент каталога, поэтому в файлах открытия/сохранения диалогов нет необходимости использовать текущий каталог Win32.

1

Каждый процесс имеет один текущий каталог, поэтому, если вы хотите, чтобы в каждом потоке вашего процесса использовался другой текущий каталог, я думаю, вы должны указать полный путь в каждом.

1

Рекомендации по использованию полных путей в общих и локальных путях только в качестве исключения (и очень тщательно), когда это необходимо. То есть Диалог OpenFile может или не может изменять текущий каталог (в зависимости от атрибутов) и т. д. Использование имен файлов или локальных путей является потенциальной причиной проблем.

По моему опыту полные пути не замедляют доступ к файлам значительно. Я написал приложение, которое каждую минуту открывает тысячи файлов и записывает отсортированные данные в другие тысячи файлов - все они используют полные пути и все на подключенном к окну сетевом диске. Узким местом было закрытие файлов. Не открывать их.

Смежные вопросы