我们需要更改多平台应用程序的默认SYSTEM临时文件夹。
获取SYSTEM临时文件夹的系统默认调用应该返回我们指定的文件夹。在MS-Windows上,这是GetTempPath()。在MacOS上,我认为这个函数叫做NSTemporaryDirectory()。
我们需要这样做,因为我们同时运行应用程序的多个实例。有些第三方库使用存储在SYSTEMs临时文件夹中的非唯一临时文件名。
对于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()的调用始终返回默认路径(不设置其他文件夹)。
我试图用TMPDIR,TEMP,TEMPDIR和TMP调用setenv(“...”) - 但在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上实现相同行为的任何建议都会非常精确。
答案 0 :(得分:2)
NSTemporaryDirectory()
使用confstr(_CS_DARWIN_USER_TEMP_DIR)
,而非$TMPDIR
。我不知道设置 confstr(3)
的API,因此我认为您需要使用{{3}覆盖NSTemporaryDirectory
或confstr$UNIX2003
或类似的机制。
但实际上,这是一个巨大的黑客攻击;如果不是这种情况,您的应用程序不应该假定它是临时目录中运行的唯一实例。它应该用mkdtemp(3)
或类似的方式进行自己的统一。