NSFileManager unique file names NSFileManager unique file names ios ios

NSFileManager unique file names


Create your own file name:

CFUUIDRef uuid = CFUUIDCreate(NULL);CFStringRef uuidString = CFUUIDCreateString(NULL, uuid);CFRelease(uuid);NSString *uniqueFileName = [NSString stringWithFormat:@"%@%@", prefixString, (NSString *)uuidString];CFRelease(uuidString);

A simpler alternative proposed by @darrinm in the comments:

NSString *prefixString = @"MyFilename";NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ;NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@", prefixString, guid];NSLog(@"uniqueFileName: '%@'", uniqueFileName);

NSLog output:
uniqueFileName: 'MyFilename_680E77F2-20B8-444E-875B-11453B06606E-688-00000145B460AF51'

Note: iOS6 introduced the NSUUID class which can be used in place of CFUUID.

NSString *guid = [[NSUUID new] UUIDString];


I use current date to generate random file name with a given extension. This is one of the methods in my NSFileManager category:

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


You can also use the venerable mktemp() (see man 3 mktemp). Like this:

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

The XXXXX will be replaced with a unique letter/number combination. They can only appear at the end of the template, so you cannot have an extension appended in the template (though you can append it after the unique file name is obtained). Add as many X as you want in the template.

The file is not created, you need to create it yourself. If you have multiple threads creating unique files in the same directory, you run the possibility of having race conditions. If this is the case, use mkstemp() which creates the file and returns a file descriptor.