Il y a des années, lorsque je travaillais avec C #, je pouvais facilement créer un fichier temporaire et obtenir son nom avec cette fonction:
Path.GetTempFileName();
Cette fonction créerait un fichier avec un nom unique dans le répertoire temporaire et renverrait le chemin complet vers ce fichier.
Dans les API Cocoa, la chose la plus proche que je puisse trouver est:
NSTemporaryDirectory
Est-ce que je manque quelque chose d'évident ou n'y a-t-il pas de moyen construit pour le faire?
Un moyen sûr consiste à utiliser mkstemp (3) .
[Remarque: ceci s'applique au SDK iPhone, pas au SDK Mac OS]
D'après ce que je peux dire, ces fonctions ne sont pas présentes dans le SDK (le fichier unistd.h
est considérablement réduit par rapport au fichier standard Mac OS X 10.5). Je voudrais utiliser quelque chose comme:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
Pas la plus jolie, mais fonctionnelle
Apple a fourni un excellent moyen d'accéder au répertoire temporaire et de créer des noms uniques pour les fichiers temporaires.
- (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;
}
LINK :::: http://developer.Apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//Apple_ref/doc/uid/DTS40009245 Voir fiche :: : AppDelegate.m
Bien que ce soit presque un an plus tard, j'ai pensé qu'il était toujours utile de mentionner un article de blog de Cocoa With Love de Matt Gallagher. http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html He montre comment utiliser mkstemp()
pour les fichiers et mkdtemp()
pour les répertoires, complète avec les conversions NSString.
J'ai créé une solution pure Cocoa au moyen d'une catégorie sur NSFileManager
qui utilise une combinaison de NSTemporary()
et d'un ID unique au monde.
Voici le fichier d'en-tête:
@interface NSFileManager (TemporaryDirectory)
-(NSString *) createTemporaryDirectory;
@end
Et le fichier d'implémentation:
@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
Cela crée un répertoire temporaire, mais pourrait être facilement adapté pour utiliser createFileAtPath:contents:attributes:
au lieu de createDirectoryAtPath:
pour créer un fichier.
Si vous ciblez iOS 6.0 ou Mac OS X 10.8 ou supérieur:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
Mise à jour pour Swift 4.2, copiée directement depuis un terrain de jeu:
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)
Ou bien oneliner de Ssswift:
let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
Vous pouvez utiliser mktemp pour obtenir un nom de fichier temporaire.
La manière moderne de faire cela est FileManager
's url(for:in:appropriateFor:create:)
.
Avec cette méthode, vous pouvez spécifier une SearchPathDirectory
pour indiquer exactement le type de répertoire temporaire souhaité. Par exemple, un .cachesDirectory
persistera entre les exécutions (dans la mesure du possible) et sera enregistré dans la bibliothèque de l'utilisateur, tandis qu'un .itemReplacementDirectory
sera sur le même volume que le fichier cible.
Vous pouvez utiliser un NSTask
à uuidgen
pour obtenir un nom de fichier unique, puis l'ajouter à une chaîne de NSTemporaryDirectory()
. Cela ne fonctionnera pas sur Cocoa Touch. C'est un peu long cependant.
Ajout à @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;
}