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.
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)))
}
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])
Swift 3 one-liner inspiré du réponse de Swift 2 basé sur UUID :
let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)
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
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)
}
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)
}
}
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