web-dev-qa-db-fra.com

Comment créer un fichier temporaire avec Cocoa?

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?

37
lfalin

Un moyen sûr consiste à utiliser mkstemp (3) .

35
user23743

[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

20
Ben Gottlieb

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

16
muzz

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.

12
Quinn Taylor

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.

11
Philipp

Si vous ciblez iOS 6.0 ou Mac OS X 10.8 ou supérieur:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
8
fzwo

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)
3
Bart van Kuik

Vous pouvez utiliser mktemp pour obtenir un nom de fichier temporaire.

2
Giao

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.

1
Ssswift

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.

0
alextgordon

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;
}
0
SwiftArchitect