objective-c cocoa file-io

objective c - ¿Cómo creo un archivo temporal con Cocoa?



objective-c file-io (11)

Actualizado para Swift 3, copiado directamente de un patio de recreo:

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)

Hace años, cuando estaba trabajando con C #, pude crear fácilmente un archivo temporal y obtener su nombre con esta función:

Path.GetTempFileName();

Esta función crearía un archivo con un nombre único en el directorio temporal y devolvería la ruta completa a ese archivo.

En las API de Cocoa, lo más cercano que puedo encontrar es:

NSTemporaryDirectory

¿Me estoy perdiendo algo obvio o no hay una forma construida para hacer esto?


Agregando a @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; }


Apple ha proporcionado una excelente manera de acceder al directorio temporal y crear nombres únicos para los archivos temporales.

- (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 ver archivo ::: AppDelegate.m


Aunque es casi un año después, pensé que aún sería útil mencionar una publicación de blog de Cocoa With Love por Matt Gallagher. cocoawithlove.com/2009/07/… Muestra cómo usar mkstemp() para archivos y mkdtemp() para directorios, completo con conversiones NSString.


La forma moderna de hacerlo es la url(for:in:appropriateFor:create:) .

Con este método, puede especificar un SearchPathDirectory para decir exactamente qué tipo de directorio temporal desea. Por ejemplo, un .cachesDirectory persistirá entre ejecuciones (como sea posible) y se guardará en la biblioteca del usuario, mientras que un .itemReplacementDirectory estará en el mismo volumen que el archivo de destino.


Puede usar mkstemp(3) para obtener un nombre de archivo temporal.


Puede usar un NSTask para uuidgen para obtener un nombre de archivo único, luego NSTemporaryDirectory() a una cadena de NSTemporaryDirectory() . Esto no funcionará en Cocoa Touch. Sin embargo, es un poco largo.


Si se orienta a iOS 6.0 o Mac OS X 10.8 o superior:

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



NSFileManager una solución de Cocoa pura por medio de una categoría en NSFileManager que usa una combinación de NSTemporary() y una ID global única.

Aquí el archivo de encabezado:

@interface NSFileManager (TemporaryDirectory) -(NSString *) createTemporaryDirectory; @end

Y el archivo de implementación:

@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

Esto crea un directorio temporal pero podría adaptarse fácilmente para usar createFileAtPath:contents:attributes: lugar de createDirectoryAtPath: para crear un archivo en su lugar.


[Nota: Esto se aplica al iPhone SDK, no al Mac OS SDK]

Por lo que puedo decir, estas funciones no están presentes en el SDK (el archivo unistd.h se reduce drásticamente en comparación con el archivo estándar Mac OS X 10.5). Yo usaría algo como:

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

No es el más bonito, pero funcional