46 votes

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ée un fichier avec un nom unique dans le répertoire temporaire et renvoie le chemin d'accès complet à ce fichier.

Dans l'API Cocoa, la chose la plus proche que je puisse trouver est :

NSTemporaryDirectory

Ai-je raté quelque chose d'évident ou n'y a-t-il pas de moyen intégré pour faire cela ?

0 votes

Attention à l'utilisation de l'API C# : l'espace de noms ne peut contenir que 65 000 fichiers et une exception sera levée lorsque ce nombre sera épuisé. Cela nous est arrivé en production - tous les programmes ne nettoient pas leurs fichiers temporaires avec diligence.

36voto

Un moyen sûr est d'utiliser mkstemp(3) .

20voto

Ben Gottlieb Points 59900

[Note : Ceci s'applique au SDK iPhone, pas au SDK Mac OS].

D'après ce que j'ai pu constater, ces fonctions ne sont pas présentes dans le SDK (la fonction unistd.h est considérablement réduit par rapport au fichier standard de Mac OS X 10.5). J'utiliserais quelque chose du genre :

[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];

Pas le plus beau, mais fonctionnel

5 votes

Il s'agit de la même condition de course que mktemp(3) : Séparer la création du nom de fichier de la création du fichier temporaire ouvre une fenêtre de vulnérabilité. Utilisez mkstemp(3) comme le suggère Graham Lee.

0 votes

Désolé, j'étais en mode iPhone ; mkstemp(3) comme suggéré par le post original est bien, mais il ne fonctionnera pas sur iPhone.

2 votes

Sur l'iPhone, chaque application possède son propre sous-arbre du système de fichiers. NSTemporaryDirectory() renvoie quelque chose dans le bundle de l'application. Vous faites toujours la course contre vous-même et contre tout ce qui a le droit d'écrire dans votre répertoire tmp, mais je pense qu'il ne s'agit que de processus privilégiés.

16voto

muzz Points 1819

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

LIEN ::: : http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 voir le fichier :::AppDelegate.m

13voto

Quinn Taylor Points 29688

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 par Matt Gallagher. http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html Il montre comment utiliser mkstemp() pour les fichiers et mkdtemp() pour les répertoires, avec conversion en NSString.

10voto

fzwo Points 5485

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X