如何用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)
现代的做法是FileManager
的url(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; }