web-dev-qa-db-fra.com

Chemin du fichier temporaire en utilisant swift

Comment obtenir un chemin de fichier temporaire unique à l’aide de Swift/Cocoa sur OS X? Cocoa ne semble pas fournir de fonction à cet effet, mais uniquement NSTemporaryDirectory() qui renvoie le chemin du répertoire temporaire. L'utilisation de la fonction BSD mktemp nécessite une chaîne C mutable en tant qu'argument.

13
tmlen

Voici une méthode possible pour utiliser mkstemp() à partir de Swift 3 et versions ultérieures. Les méthodes URL sont utilisées pour convertir entre les instances URL et les chaînes C représentant le chemin du système de fichiers:

// 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)))
}

Ancien code pour 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)))
}
18
Martin R

Apple a essayé de s’éloigner de path-as-string et de passer à NSURL. Voici un moyen:

Swift 3:

let directory = NSTemporaryDirectory()
let fileName = NSUUID().uuidString

// This returns a URL? even though it is an NSURL class method
let fullURL = NSURL.fileURL(withPathComponents: [directory, fileName])

Swift 2:

let directory = NSTemporaryDirectory()
let fileName = NSUUID().UUIDString

let fullURL = NSURL.fileURLWithPathComponents([directory, fileName])
26
Code Different

Swift 3 one-liner inspiré du réponse de Swift 2 basé sur UUID

let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)
5
mz2

Utilisez un GUID (identificateur global unique):

let directory :NSString = "directory"
let randomName = NSProcessInfo().globallyUniqueString
let path = directory.stringByAppendingPathComponent(randomName)

répertoire/3B635E49-813A-4324-B4B8-56279B42BEAB-36687-0002D962615DAE5F

4
zaph

J'aime l'idée de cet article: NSTemporary Directory - NSHipster

Ceci utilise NSTemporaryDirectory() pour le dossier temporaire et ProcessInfo.processInfo.globallyUniqueString pour générer une chaîne unique.

Swift 4:

func uniqueTempFolderURL() -> URL
{
    let folderName = ProcessInfo.processInfo.globallyUniqueString
    return URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true).appendingPathComponent(folderName)
}
1
palme

Swift3

Je suis venu chercher quelque chose comme boost :: système de fichiers :: unique_path ()

J'ai donc fait cette extension à la classe d'URL.

extension URL {
    func appendingUniquePathComponent(pathExtension: String? = nil) -> URL {
        var pathComponent = UUID().uuidString
        if let pathExtension = pathExtension {
            pathComponent += ".\(pathExtension)"
        }
        return appendingPathComponent(pathComponent)
    }
}

Usage:

let url0 = URL(fileURLWithPath: "/tmp/some/dir")
let url1 = url0.appendingUniquePathComponent(pathExtension: "jpg")
print("url1: \(url1)")
// url1: file:///tmp/some/dir/936324FF-EEDB-410E-AD09-E24D5EB4A24F.jpg
1
neoneye