SetCurrentDirectory в многопоточном приложении - PullRequest
4 голосов
/ 30 июня 2009

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

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

Ответы [ 3 ]

7 голосов
/ 30 июня 2009

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

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

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

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

1 голос
/ 30 июня 2009

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

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

1 голос
/ 30 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...