2009-11-18 4 views
1

нам нужно изменить папку SYSTEM temp по умолчанию для нашего многоплатформенного приложения.MacOS - как изменить папку SYSTEM temp (программно)?

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

Нам нужно сделать это, потому что мы одновременно запускаем несколько экземпляров нашего приложения. Существуют некоторые сторонние библиотеки, в которых используются неспецифические временные имена файлов, хранящиеся в папке tems 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 

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

Я попытался вызвать 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, будут очень изрезаны.

+5

Зачем вам это нужно? – ceejayoz

+0

Поскольку у вас есть определенный справочник, вы можете просто использовать это, а не вызывать NSTemporaryDirectory? – Jeff

+0

нет, к сожалению нет. В нашем приложении используются некоторые сторонние библиотеки, и эти сторонние библиотеки вызывают NSTemporaryDirectory(), чтобы получить временную папку SYSTEM – 2009-11-18 19:42:34

ответ

2

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

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

+0

Вы правы. Взлом с confstr или с DYLD_INSERT_LIBRARIES не является вариантом. Итак, для MacOS я попробую обходное решение для получения папки tmp: верните значение TMPDIR, если оно установлено, в противном случае верните значение, предоставленное NSTemporaryDirectory. Но это все еще имеет тот недостаток, что используемые сторонние библиотеки не будут использовать TMPDIR. – 2009-11-19 08:34:21

+0

... мы реализовали это сейчас. Как и ожидалось, этот подход хорошо работает для нашего собственного приложения/наших собственных библиотек. Но не для сторонних библиотек, используемых нашим приложением. – 2009-11-20 12:43:45

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