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]];
Una forma segura es usar mkstemp(3) .
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