Как мне создать временный файл с Какао? - PullRequest
38 голосов
/ 19 октября 2008

Несколько лет назад, когда я работал с C #, я мог легко создать временный файл и получить его имя с помощью этой функции:

Path.GetTempFileName();

Эта функция создаст файл с уникальным именем во временном каталоге и вернет полный путь к этому файлу.

В API-интерфейсе Cocoa самое близкое, что я могу найти:

NSTemporaryDirectory

Я упускаю что-то очевидное или нет встроенного способа сделать это?

Ответы [ 11 ]

35 голосов
/ 19 октября 2008

Безопасным способом является использование mkstemp (3) .

20 голосов
/ 19 октября 2008

[Примечание: это относится к iPhone SDK, а не к Mac OS SDK]

Из того, что я могу сказать, этих функций нет в SDK (файл unistd.h значительно сокращен по сравнению со стандартным файлом Mac OS X 10.5). Я бы использовал что-то вроде:

[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];

Не самая красивая, но функциональная

16 голосов
/ 29 ноября 2011

Apple предоставила отличный способ доступа к временному каталогу и создания уникальных имен для временных файлов.

- (NSString *)pathForTemporaryFileWithPrefix:(NSString *)prefix
{
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;

    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);

    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);

    result = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@", prefix, uuidStr]];
    assert(result != nil);

    CFRelease(uuidStr);
    CFRelease(uuid);

    return result;
}

ССЫЛКА :::: http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 посмотреть файл ::: AppDelegate.m

13 голосов
/ 22 сентября 2009

Хотя это почти год спустя, я подумал, что все же полезно упомянуть пост в блоге «Какао с любовью» Мэтта Галлахера. http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html Он показывает, как использовать mkstemp() для файлов и mkdtemp() для каталогов, с преобразованиями NSString.

11 голосов
/ 23 октября 2010

Я создал решение для чистого какао с помощью категории на NSFileManager, в которой используется комбинация NSTemporary() и глобально уникальный идентификатор.

Здесь заголовочный файл:

@interface NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory;

@end

И файл реализации:

@implementation NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory {
 // Create a unique directory in the system temporary directory
 NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
 NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid];
 if (![self createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil]) {
  return nil;
 }
 return path;
}

@end

Это создает временный каталог, но его можно легко адаптировать для использования createFileAtPath:contents:attributes: вместо createDirectoryAtPath: для создания файла.

8 голосов
/ 15 июля 2014

При ориентации на iOS 6.0 или Mac OS X 10.8 или выше:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
3 голосов
/ 03 июля 2015

Обновлено для Swift 4.2, скопировано прямо с игровой площадки:

import Foundation

func pathForTemporaryFile(with prefix: String) -> URL {
    let uuid = UUID().uuidString
    let pathComponent = "\(prefix)-\(uuid)"
    var tempPath = URL(fileURLWithPath: NSTemporaryDirectory())
    tempPath.appendPathComponent(pathComponent)
    return tempPath
}

let url = pathForTemporaryFile(with: "blah")
print(url)

Или, в качестве альтернативы, Ssswift:

let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
2 голосов
/ 19 октября 2008

Вы можете использовать mktemp , чтобы получить временное имя файла.

1 голос
/ 16 июня 2017

Современный способ сделать это - FileManager * url(for:in:appropriateFor:create:).

С помощью этого метода вы можете указать SearchPathDirectory, чтобы точно указать, какой тип временного каталога вы хотите. Например, .cachesDirectory будет сохраняться между запусками (насколько это возможно) и сохраняться в библиотеке пользователя, тогда как .itemReplacementDirectory будет находиться на том же томе, что и целевой файл.

0 голосов
/ 07 июля 2014

Добавление к @Philipp:

- (NSString *)createTemporaryFile:(NSData *)contents {
    // Create a unique file in the system temporary directory
    NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid];
    if(![self createFileAtPath:path contents:contents attributes:nil]) {
        return nil;
    }
    return path;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...