43

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

Path.GetTempFileName();

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

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

NSTemporaryDirectory

我是否遗漏了一些明显的东西,或者没有内置的方法来做到这一点?

4

11 回答 11

36

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

于 2008-10-19T01:37:40.447 回答
21

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

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

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

不是最漂亮,但功能齐全

于 2008-10-19T02:58:41.673 回答
17

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

于 2011-11-29T06:58:58.160 回答
11

我通过一个使用全局唯一 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:创建文件。

于 2010-10-22T23:18:48.143 回答
10

如果面向 iOS 6.0 或 Mac OS X 10.8 或更高版本:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
于 2014-07-15T10:02:22.863 回答
6

斯威夫特 5 和斯威夫特 4.2

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)
于 2015-07-03T11:12:21.900 回答
2

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

于 2008-10-19T01:24:17.480 回答
2

执行此操作的现代方法是FileManager's url(for:in:appropriateFor:create:)

使用这种方法,您可以指定一个SearchPathDirectory来准确说​​明您想要什么样的临时目录。例如, a.cachesDirectory将在运行之间保持(尽可能)并保存在用户的库中,而 a.itemReplacementDirectory将与目标文件位于同一卷上。

于 2017-06-16T18:17:30.423 回答
2

不要使用遗留 API,例如NSTemporaryDirectoryURLFileManager.

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

您仍然必须创建目录。

于 2020-04-29T10:34:15.780 回答
0

您可以使用NSTasktouuidgen获取唯一的文件名,然后将其附加到来自NSTemporaryDirectory(). 这不适用于 Cocoa Touch。虽然有点啰嗦。

于 2008-10-19T13:13:25.413 回答
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;
}
于 2014-07-07T03:43:30.500 回答