访问Swift中的临时目录

Cai*_*Cai 7 macos cocoa objective-c swift

我试图访问Swift中的临时目录.在Objective-C中,我可以使用以下代码来执行此操作:

- (NSString *)tempDirectory {

    NSString *tempDirectoryTemplate =
    [NSTemporaryDirectory() stringByAppendingPathComponent:@"XXXXX"];
    const char *tempDirectoryTemplateCString = [tempDirectoryTemplate fileSystemRepresentation];
    char *tempDirectoryNameCString           = (char *)malloc(strlen(tempDirectoryTemplateCString) + 1);
    strcpy(tempDirectoryNameCString, tempDirectoryTemplateCString);
    char *result                             = mkdtemp(tempDirectoryNameCString);
    if (!result) {
        return nil;
    }
    NSString *tempDirectoryPath = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:tempDirectoryNameCString length:strlen(result)];
    free(tempDirectoryNameCString);
    return tempDirectoryPath;
}
Run Code Online (Sandbox Code Playgroud)

但是,我对从Objective-C到Swift的类型转换和转换有点困惑,例如 const char *CMutablePointer<CChar>.有没有我应该研究的文件?

谢谢.

Gri*_*mxn 11

怎么样的:

func createTempDirectory() -> String? {
    let tempDirectoryTemplate = NSTemporaryDirectory().stringByAppendingPathComponent("XXXXX")

    let fileManager = NSFileManager.defaultManager()

    var err: NSErrorPointer = nil
    if fileManager.createDirectoryAtPath(tempDirectoryTemplate, withIntermediateDirectories: true, attributes: nil, error: err) {
        return tempDirectoryTemplate
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

它没有回答你关于char*的问题但它更干净......

NSFileManager 在这里引用.

另请查看有关唯一名称的SO问题.

  • 请注意,BSD函数`mkdtemp()`与NSFileManager`createDirectoryAtPath`方法不同,因为它从给定模板创建*唯一目录名*. (3认同)

Vla*_*man 8

Swift 2.1版本:

func createTempDirectory() -> String? {

    let tempDirURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("XXXXXX")

    do {
        try NSFileManager.defaultManager().createDirectoryAtURL(tempDirURL, withIntermediateDirectories: true, attributes: nil)
    } catch {
        return nil
    }

    return tempDirURL.absoluteString
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*tzi 7

根据 Apple 的说法,NSTemporaryDirectory不鼓励使用:

有关查找正确临时目录的首选方法,请参阅 FileManager 方法 url(for:in:propertyFor:create:)。有关临时文件的更多信息,请参阅文件系统编程指南。

所以相反,你应该使用 FileManager.default.temporaryDirectory

或者如果你想要一个独特的路径:

let extractionPath = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString, isDirectory: true)

Run Code Online (Sandbox Code Playgroud)


use*_*195 5

Swift 3 及更高版本

我认为快速执行此操作的一个好方法是使用 FileManager 上的扩展。这应该会创建一个唯一的临时文件夹并将 URL 返回给您。

extension FileManager{

    func createTemporaryDirectory() throws -> URL {
        let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)

        try createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)
        return url
    }
}
Run Code Online (Sandbox Code Playgroud)