Как получить временный каталог по умолчанию в Mac OS X? - PullRequest
23 голосов
/ 17 декабря 2008

Я хотел бы создать несколько каталогов данных для некоторых модульных тестов, и я хотел бы, чтобы эти каталоги были во временном каталоге по умолчанию для пользователя.

Полагаю, я мог бы просто создать подкаталог в / tmp, но я не хочу делать предположения о том, как кто-то настроил свою собственную машину.

Я планирую записать тестовые данные на лету, поэтому я хотел бы поместить их во временный каталог.

Ответы [ 4 ]

39 голосов
/ 17 декабря 2008

Не используйте tmpnam() или tempnam(). Они небезопасны (см. Справочную страницу ). Не принимайте /tmp. Используйте NSTemporaryDirectory() в сочетании с mkdtemp(). NSTemporaryDirectory() даст вам лучший каталог для использования, однако он может вернуть nil. Я использовал код, похожий на этот:

NSString * tempDir = NSTemporaryDirectory();
if (tempDir == nil)
    tempDir = @"/tmp";

NSString * template = [tempDir stringByAppendingPathComponent: @"temp.XXXXXX"];
NSLog(@"Template: %@", template);
const char * fsTemplate = [template fileSystemRepresentation];
NSMutableData * bufferData = [NSMutableData dataWithBytes: fsTemplate
                                                   length: strlen(fsTemplate)+1];
char * buffer = [bufferData mutableBytes];
NSLog(@"FS Template: %s", buffer);
char * result = mkdtemp(buffer);
NSString * temporaryDirectory = [[NSFileManager defaultManager]
        stringWithFileSystemRepresentation: buffer
                                    length: strlen(buffer)];

Теперь вы можете создавать файлы внутри temporaryDirectory. Удалите NSLogs для производственного кода.

8 голосов
/ 22 марта 2012

Оглядываясь назад на этот вопрос и документацию для NSTevenDirectory (), если вы используете 10.6 или выше, то вам рекомендуется использовать URLForDirectory: inDomain: assignForURL: create: error: метод из NSFileManager для более гибкого метода создания каталогов.

И он возвращает URL вместо строкового пути, что является другой вещью, которую мы рекомендуем использовать.

6 голосов
/ 17 декабря 2008

В Objective-C вы можете использовать NSTevenDirectory ().

5 голосов
/ 17 декабря 2008

Используйте функции tempnam (), tmpnam () или tmpfile () .

...