我们需要更改多平台应用程序的默认系统临时文件夹。
获取系统临时文件夹的系统默认调用应返回我们指定的文件夹。在MS-Windows上,这是GetTempPath()
。在MacOS上,这个函数应该叫做NSTemporaryDirectory()
。
我们需要这样做,因为我们同时运行应用程序的多个实例。有些第三方库使用存储在系统临时文件夹中的非唯一临时文件名。
对于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 OS风格实现的:
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上实现相同的行为?
发布于 2009-11-19 12:47:15
NSTemporaryDirectory()
使用confstr(_CS_DARWIN_USER_TEMP_DIR)
,而不是$TMPDIR
。我不知道有什么API来设置confstr(3)
s,所以我想你需要用DYLD_INSERT_LIBRARIES
或者类似的机制覆盖NSTemporaryDirectory
或者confstr$UNIX2003
。
但实际上,这是一个巨大的技巧;如果不是这样,您的应用程序不应该假设它是在临时目录中运行的唯一实例。它应该用mkdtemp(3)
或类似的东西来做自己的唯一性。
https://stackoverflow.com/questions/1758460
复制相似问题