Ответ 1
Безопасный способ - использовать mkstemp (3).
Несколько лет назад, когда я работал с С#, я мог легко создать временный файл и получить его имя с помощью этой функции:
Path.GetTempFileName();
Эта функция создаст файл с уникальным именем во временном каталоге и вернет полный путь к этому файлу.
В API Cocoa, ближайшая вещь, которую я могу найти, это:
NSTemporaryDirectory
Я пропустил что-то очевидное или нет встроенного способа сделать это?
Безопасный способ - использовать mkstemp (3).
[Примечание: это относится к iPhone SDK, а не к Mac OS SDK]
Из того, что я могу сказать, эти функции отсутствуют в SDK (файл unistd.h
резко сокращается по сравнению со стандартным файлом Mac OS X 10.5). Я бы использовал что-то по строкам:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
Не самый красивый, но функциональный
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
Хотя это почти год спустя, я решил, что все же полезно упомянуть сообщение в блоге из Cocoa С любовью Мэттом Галлахером. http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html Он показывает, как использовать mkstemp()
для файлов и mkdtemp()
для каталогов, в комплекте с преобразованиями NSString.
Я создал чистое решение 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:
для создания файла.
Если таргетинг на iOS 6.0 или Mac OS X 10.8 или выше:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
Вы можете использовать mktemp, чтобы получить имя файла temp.
Обновлено для 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)
Современный способ сделать это FileManager
url(for:in:appropriateFor:create:)
.
С помощью этого метода вы можете указать SearchPathDirectory
, чтобы точно указать, какой именно временный каталог вы хотите. Например, .cachesDirectory
будет сохраняться между прогонами (насколько это возможно) и сохраняется в пользовательской библиотеке, а .itemReplacementDirectory
будет на том же томе, что и целевой файл.
Вы можете использовать NSTask
to uuidgen
для получения уникального имени файла, а затем добавить его к строке из NSTemporaryDirectory()
. Это не будет работать на Cocoa Touch. Это немного затянуто, хотя.
Добавление к @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;
}