objective c - Nombres de archivos únicos de NSFileManager
objective-c ios (8)
Necesito una manera rápida y fácil de almacenar archivos con nombres de archivo únicos en iOS. Necesito agregar un prefijo al archivo con una cadena, y luego anexar el identificador único generado hasta el final. Esperaba que NSFileManager
tuviese algún método conveniente para hacer esto, pero parece que no puedo encontrarlo.
Estaba buscando en createFileAtPath:contents:attributes:
pero no estoy seguro si los atributos me darán ese nombre de archivo único.
Crea tu propio nombre de archivo:
CFUUIDRef uuid = CFUUIDCreate(NULL);
CFStringRef uuidString = CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
NSString *uniqueFileName = [NSString stringWithFormat:@"%@%@", prefixString, (NSString *)uuidString];
CFRelease(uuidString);
Una alternativa más simple propuesta por @darrinm en los comentarios:
NSString *prefixString = @"MyFilename";
NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ;
NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@", prefixString, guid];
NSLog(@"uniqueFileName: ''%@''", uniqueFileName);
Salida NSLog:
uniqueFileName: ''MyFilename_680E77F2-20B8-444E-875B-11453B06606E-688-00000145B460AF51''
Nota: iOS6 introdujo la clase NSUUID que se puede usar en lugar de CFUUID.
NSString *guid = [[NSUUID new] UUIDString];
En iOS 6, el método más simple es usar:
NSString *uuidString = [[NSUUID UUID] UUIDString];
Esto es lo que terminé usando en Swift 3.0
public func generateUniqueFilename (myFileName: String) -> String {
let guid = ProcessInfo.processInfo.globallyUniqueString
let uniqueFileName = ("/(myFileName)_/(guid)")
print("uniqueFileName: /(uniqueFileName)")
return uniqueFileName
}
Esto probablemente debería funcionar para usted:
http://vgable.com/blog/2008/02/24/creating-a-uuid-guid-in-cocoa/
El autor de la publicación sugiere implementar un método ''stringWithUUID'' como una categoría de NSString. Simplemente agregue un GUID generado con este método al final del nombre de archivo que está creando.
Super-fácil Swift 4 1-liner:
fileName = "MyFileName_" + UUID().uuidString
o
fileName = "MyFileName_" + ProcessInfo().globallyUniqueString
Swift 4.1. Simplemente pase el nombre de la extensión de archivo y la función devolverá el nombre de archivo único.
func uniqueFileNameWithExtention(fileExtension: String) -> String {
let uniqueString: String = ProcessInfo.processInfo.globallyUniqueString
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMddhhmmsss"
let dateString: String = formatter.string(from: Date())
let uniqueName: String = "/(uniqueString)_/(dateString)"
if fileExtension.length > 0 {
let fileName: String = "/(uniqueName)./(fileExtension)"
return fileName
}
return uniqueName
}
También puedes usar el venerable mktemp()
(ver man 3 mktemp
). Me gusta esto:
- (NSString*)createTempFileNameInDirectory:(NSString*)dir
{
NSString* templateStr = [NSString stringWithFormat:@"%@/filename-XXXXX", dir];
char template[templateStr.length + 1];
strcpy(template, [templateStr cStringUsingEncoding:NSASCIIStringEncoding]);
char* filename = mktemp(template);
if (filename == NULL) {
NSLog(@"Could not create file in directory %@", dir);
return nil;
}
return [NSString stringWithCString:filename encoding:NSASCIIStringEncoding];
}
El XXXXX
será reemplazado con una combinación única de letras / números. Solo pueden aparecer al final de la plantilla, por lo que no puede tener una extensión adjunta en la plantilla (aunque puede agregarla después de que se obtenga el nombre único del archivo). Agregue tantas X
como desee en la plantilla.
El archivo no se crea, debes crearlo tú mismo. Si tiene varios hilos que crean archivos únicos en el mismo directorio, corre la posibilidad de tener condiciones de carrera. Si este es el caso, use mkstemp()
que crea el archivo y devuelve un descriptor de archivo.
Uso la fecha actual para generar un nombre de archivo aleatorio con una extensión dada. Este es uno de los métodos en mi categoría NSFileManager:
+ (NSString*)generateFileNameWithExtension:(NSString *)extensionString { // Extenstion string is like @".png" NSDate *time = [NSDate date]; NSDateFormatter* df = [NSDateFormatter new]; [df setDateFormat:@"dd-MM-yyyy-hh-mm-ss"]; NSString *timeString = [df stringFromDate:time]; NSString *fileName = [NSString stringWithFormat:@"File-%@%@", timeString, extensionString]; return fileName; }