多年前,当我使用C#时,我可以轻松地创建一个临时文件并使用这个函数获取其名称:
Path.GetTempFileName();
这个函数会在临时目录中创建一个唯一命名的文件,并返回该文件的完整路径。
在Cocoa API中,我能找到最接近的是:
NSTemporaryDirectory
我是否漏掉了一些显而易见的东西,还是说没有内置的方法可以做到这一点?
多年前,当我使用C#时,我可以轻松地创建一个临时文件并使用这个函数获取其名称:
Path.GetTempFileName();
这个函数会在临时目录中创建一个唯一命名的文件,并返回该文件的完整路径。
在Cocoa API中,我能找到最接近的是:
NSTemporaryDirectory
我是否漏掉了一些显而易见的东西,还是说没有内置的方法可以做到这一点?
一个安全的方法是使用mkstemp(3)。
[注意:此适用于iPhone SDK,而非Mac OS SDK]
据我所知,在SDK中并没有这些函数(与标准的Mac OS X 10.5文件相比,unistd.h
文件大幅减少)。建议使用类似以下方式的替代方法:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
虽然不够美观,但功能齐全。
NSUUID
,即 NSString *uuidString = [[NSUUID UUID] UUIDString];
。 - Jay苹果提供了一种很好的方式来访问临时目录并为临时文件创建唯一的名称。
- (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
我通过给NSFileManager
创建一个分类,使用NSTemporary()
和全局唯一标识符的组合,来实现了一个纯Cocoa解决方案。
以下是头文件:
@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]];
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)
// file:///var/folders/42/fg3l5j123z6668cgt81dhks80000gn/T/johndoe.KillerApp/blah-E1DCE512-AC4B-4EAB-8838-547C0502E264
let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
。 - SsswiftFileManager
的url(for:in:appropriateFor:create:)
。SearchPathDirectory
来确定您想要的临时目录类型。例如,.cachesDirectory
将在用户的库中持久存在(如果可能),而.itemReplacementDirectory
将在目标文件所在的卷上。不要使用像NSTemporaryDirectory
这样的遗留API,而是从FileManager
中获取一个合适的URL
。
let tmpURL = FileManager
.default
.temporaryDirectory
.appendingPathComponent(UUID().uuidString)
您仍然需要创建该目录。
NSTask
来调用 uuidgen
命令来获取一个唯一的文件名,然后将其附加到从 NSTemporaryDirectory()
获取的字符串中。但这在 Cocoa Touch 上不起作用。虽然有点冗长。NSTask
来执行uuidgen
有点过头了。 - dreamlax