Search code examples
macosswiftcocoa

Temporary file path using swift


How to get a unique temporary file path using Swift/Cocoa on OS X? Cocoa does not seem to provide a function for this, only NSTemporaryDirectory() which returns the path of the temporary directory. Using the BSD mktemp function requires a mutable C-string as argument.


Solution

  • Here is a possible method to use mkstemp() from Swift 3 and later. URL methods are used to convert between URL instances and C strings representing the file system path:

    // The template string:
    let template = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("file.XXXXXX") as NSURL
    
    // Fill buffer with a C string representing the local file system path. 
    var buffer = [Int8](repeating: 0, count: Int(PATH_MAX))
    template.getFileSystemRepresentation(&buffer, maxLength: buffer.count)
    
    // Create unique file name (and open file):
    let fd = mkstemp(&buffer)
    if fd != -1 {
    
        // Create URL from file system string:
        let url = URL(fileURLWithFileSystemRepresentation: buffer, isDirectory: false, relativeTo: nil)
        print(url.path)
    
    } else {
        print("Error: " + String(cString: strerror(errno)))
    }
    

    Older code for Swift 2:

    // The template string:
    let template = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent("file.XXXXXX")
    
    // Fill buffer with a C string representing the local file system path. 
    var buffer = [Int8](count: Int(PATH_MAX), repeatedValue: 0)
    template.getFileSystemRepresentation(&buffer, maxLength: buffer.count)
    
    // Create unique file name (and open file):
    let fd = mkstemp(&buffer)
    if fd != -1 {
    
        // Create URL from file system string:
        let url = NSURL(fileURLWithFileSystemRepresentation: buffer, isDirectory: false, relativeToURL: nil)
        print(url.path!)
    
    } else {
        print("Error: " + String(strerror(errno)))
    }