如何使用Cocoa创建临时文件?

时间:2008-10-19 01:09:25

标签: objective-c cocoa file-io

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

Path.GetTempFileName();

此函数将在临时目录中创建具有唯一名称的文件,并返回该文件的完整路径。

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

NSTemporaryDirectory

我是否遗漏了一些显而易见的事情,或者没有内置方法可以做到这一点?

11 个答案:

答案 0 :(得分:35)

安全的方法是使用mkstemp(3)

答案 1 :(得分:20)

[注意:这适用于iPhone SDK,而不适用于Mac OS SDK]

据我所知,这些功能在SDK中不存在(与标准Mac OS X 10.5文件相比,unistd.h文件大幅减少)。我会使用以下内容:

[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];

不是最漂亮但功能齐全的

答案 2 :(得分:13)

虽然差不多一年之后,我认为提起Matt Gallagher的Cocoa With Love的博客文章仍然有帮助。 http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html他展示了如何将 mkstemp() 用于文件, mkdtemp() 用于目录,并完成NSString转换。

答案 3 :(得分:11)

我通过NSFileManager上使用NSTemporary()和全球唯一ID组合的类别创建了纯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:来创建文件。

答案 4 :(得分:8)

如果定位到iOS 6.0或Mac OS X 10.8或更高版本:

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

答案 5 :(得分:3)

针对Swift 4.2进行了更新,直接从Playground复制:

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)

答案 6 :(得分:2)

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

答案 7 :(得分:1)

现代的方法是FileManager url(for:in:appropriateFor:create:)

使用此方法,您可以指定SearchPathDirectory来准确说出所需的临时目录类型。例如,.cachesDirectory将在运行之间保持(尽可能)并保存在用户的库中,而.itemReplacementDirectory将与目标文件位于同一个卷上。

答案 8 :(得分:0)

您可以使用NSTaskuuidgen获取唯一的文件名,然后将其附加到NSTemporaryDirectory()的字符串中。这对Cocoa Touch无效。虽然这有点啰嗦。

答案 9 :(得分:0)

添加到@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;
}

答案 10 :(得分:0)

请勿使用NSTemporaryDirectory之类的旧式API,而应从URL中获取适当的FileManager

let tmpURL = FileManager
    .default
    .temporaryDirectory
    .appendingPathComponent(UUID().uuidString)

您仍然必须创建目录。