MacOS - как изменить временную папку SYSTEM (программно)? - PullRequest
1 голос
/ 18 ноября 2009

нам нужно изменить временную папку SYSTEM по умолчанию для нашего мультиплатформенного приложения.

Системный вызов по умолчанию для получения временной папки SYSTEM должен вернуть указанную папку. В MS-Windows это GetTempPath (). На MacOS эта функция называется NSTevenDirectory (), я думаю.

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

Для Microsoft Windows и для платформ Unix у нас уже есть решение:

   Microsoft Windows:

        setenv("TMP", myOwnTempFolder);
        tmpFolderToUse=GetTempPath(); // use WinOS API call


   Unix:

         setenv("TMPDIR", myOwnTempFolder);
         tmpFolderToUse = getenv("TMPDIR");

, но это не работает для MacOS (X).

   MacOS:

         setenv("TMPDIR", myOwnTempFolder);
         tmpFolderToUse = NSTemporaryDirectory(); // use MacOS API call

Вызов NSTeilitaryDirectory () всегда возвращает путь по умолчанию впоследствии (как без установки другой папки).

Я пытался вызвать setenv ("...") с TMPDIR, TEMP, TEMPDIR и TMP - но безуспешно в MacOSX.

Для пояснения: вот пример с несколькими экземплярами псевдокода, который в настоящее время реализован для разновидности ОС Windows нашего приложения:

instance1:

tmp=GetTempPath(); // -> 'C:\User\testing\temp'
uuid=getUUID(); // -> 'd7c5df40-d48d-11de-8a39-0800200c9a66'
setenv("TMP", tmp + uuid);
tmp=GetTempPath(); // --> 'C:\User\testing\temp\d7c5df40-d48d-11de-8a39-0800200c9a66' 

instance2:

tmp=GetTempPath(); // -> 'C:\User\testing\temp'
uuid=getUUID(); // -> '435aeb10-d48e-11de-8a39-0800200c9a66'
setenv("TMP", tmp + uuid);
tmp=GetTempPath(); // --> 'C:\User\testing\temp\435aeb10-d48e-11de-8a39-0800200c9a66'

Любой совет о том, как добиться такого же поведения в MacOS, будет очень кратким.

1 Ответ

2 голосов
/ 19 ноября 2009

NSTemporaryDirectory() использует confstr(_CS_DARWIN_USER_TEMP_DIR), а не $TMPDIR. Я не знаю API для set confstr(3) s, поэтому я думаю, вам нужно переопределить либо NSTemporaryDirectory, либо confstr$UNIX2003 с DYLD_INSERT_LIBRARIES или аналогичный механизм.

Но на самом деле, это огромный взлом; Ваше приложение не должно предполагать, что это единственный экземпляр, работающий во временном каталоге, если это не так. Он должен сделать свое собственное уникальное с mkdtemp(3) или подобным.

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