几年前,当我使用 C# 时,我可以轻松地创建一个临时文件并使用此函数获取其名称:
Path.GetTempFileName();
此函数将在临时目录中创建一个具有唯一名称的文件,并返回该文件的完整路径。
在 Cocoa API 中,我能找到的最接近的是:
NSTemporaryDirectory
我是否遗漏了一些明显的东西,或者没有内置的方法来做到这一点?
几年前,当我使用 C# 时,我可以轻松地创建一个临时文件并使用此函数获取其名称:
Path.GetTempFileName();
此函数将在临时目录中创建一个具有唯一名称的文件,并返回该文件的完整路径。
在 Cocoa API 中,我能找到的最接近的是:
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;
}
链接 :::: http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 见文件 :::AppDelegate.m
我通过一个使用全局唯一 IDNSFileManager
组合的类别创建了一个纯 Cocoa 解决方案。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]];
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
或者 Ssswift 的 oneliner:
let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
您可以使用mktemp获取临时文件名。
执行此操作的现代方法是FileManager
's url(for:in:appropriateFor:create:)
。
使用这种方法,您可以指定一个SearchPathDirectory
来准确说明您想要什么样的临时目录。例如, a.cachesDirectory
将在运行之间保持(尽可能)并保存在用户的库中,而 a.itemReplacementDirectory
将与目标文件位于同一卷上。
不要使用遗留 API,例如NSTemporaryDirectory
,URL
从FileManager
.
let tmpURL = FileManager
.default
.temporaryDirectory
.appendingPathComponent(UUID().uuidString)
您仍然必须创建目录。
您可以使用NSTask
touuidgen
获取唯一的文件名,然后将其附加到来自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;
}