it-swarm.com.ru

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

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

Path.GetTempFileName();

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

В API Какао самое близкое, что я могу найти, это:

NSTemporaryDirectory

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

37
lfalin

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

35
user23743

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

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

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

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

20
Ben Gottlieb

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

16
muzz

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

12
Quinn Taylor

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

11
Philipp

Если используется iOS 6.0 или Mac OS X 10.8 или выше:

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

Обновлено для 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)
3
Bart van Kuik

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

2
Giao

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

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

1
Ssswift

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

0
alextgordon

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