如何用Cocoa创build一个临时文件?

多年前,当我用C#工作时,我可以轻松地创build一个临时文件,并使用此函数获取其名称:

Path.GetTempFileName(); 

该函数将在临时目录中创build一个具有唯一名称的文件,并返回该文件的完整path。

在Cocoa API中,我能find的最接近的是:

 NSTemporaryDirectory 

我是否错过了一些显而易见的东西,还是没有build立起来?

一个安全的方法是使用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"]]; 

不是最漂亮的,但function

Apple为访问临时目录和为临时文件创build唯一名称提供了一个绝佳的途径。

 - (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

虽然差不多一年之后,但我认为,马特·加拉格尔(Matt Gallagher)提到“cocoa爱”(Cocoa With Love)的博客文章仍然有帮助。 http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html他演示了如何在文件和;mkdtemp()使用mkstemp()来完成NSString转换。

我使用NSTemporary()和全局唯一ID的组合,在NSFileManager上创build了一个纯粹的Cocoa解决scheme。

这里的头文件:

 @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 

这会创build一个临时目录,但可以很容易地使用createFileAtPath:contents:attributes:来代替createDirectoryAtPath:来创build一个文件。

如果以iOS 6.0或Mac OS X 10.8或更高版本为目标:

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

您可以使用mktemp来获取临时文件名。

更新了Swift 3,直接从游乐场复制:

 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) 

现代的做法是FileManagerurl(for:in:appropriateFor:create:)

有了这个方法,你可以指定一个SearchPathDirectory来说明你想要的临时目录。 例如, .cachesDirectory将在运行之间保留(尽可能)并保存在用户的库中,而.itemReplacementDirectory将与目标文件位于同一个卷上。

您可以使用NSTask来获取唯一的文件名,然后将其附加到来自NSTemporaryDirectory()的string中。 这在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; }