MacOS - 如何更改SYSTEM临时文件夹(以编程方式)?

时间:2009-11-18 19:30:38

标签: cocoa xcode macos

我们需要更改多平台应用程序的默认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上实现相同行为的任何建议都会非常精确。

1 个答案:

答案 0 :(得分:2)

NSTemporaryDirectory()使用confstr(_CS_DARWIN_USER_TEMP_DIR),而非$TMPDIR。我不知道设置 confstr(3)的API,因此我认为您需要使用{{3}覆盖NSTemporaryDirectoryconfstr$UNIX2003或类似的机制。

但实际上,这是一个巨大的黑客攻击;如果不是这种情况,您的应用程序不应该假定它是临时目录中运行的唯一实例。它应该用mkdtemp(3)或类似的方式进行自己的统一。