Как создать временный файл с помощью Cocoa?

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

Path.GetTempFileName();

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

В API Cocoa, ближайшая вещь, которую я могу найти, это:

NSTemporaryDirectory

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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;
}

LINK:: http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 см. файл: AppDelegate.m

Ответ 4

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

Ответ 5

Я создал чистое решение Cocoa с помощью категории на 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: для создания файла.

Ответ 6

Если таргетинг на iOS 6.0 или Mac OS X 10.8 или выше:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];

Ответ 7

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

Ответ 8

Обновлено для 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 oneliner:

let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)

Ответ 9

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

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

Ответ 10

Вы можете использовать NSTask to uuidgen для получения уникального имени файла, а затем добавить его к строке из NSTemporaryDirectory(). Это не будет работать на Cocoa Touch. Это немного затянуто, хотя.

Ответ 11

Добавление к @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;
}