NSFileManager唯一的文件名

我需要一个快速简单的方法来在iOS上存储具有唯一文件名的文件。 我需要在文件前加一个string,然后将生成的唯一标识符追加到最后。 我希望NSFileManager有一些方便的方法来做到这一点,但我似乎无法find它。

我在看createFileAtPath:contents:attributes:但我不确定这些属性是否会给我这个唯一的文件名。

创build您自己的文件名称:

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

@darrinm在评论中提出了一个更简单的替代scheme:

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

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

注意:iOS6引入了可以用来代替CFUUID的NSUUID类。

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

你也可以使用古老的mktemp() (见man 3 mktemp )。 喜欢这个:

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

XXXXX将被replace为一个独特的字母/数字组合。 它们只能出现在模板的末尾,所以不能在模板中附加扩展名(尽pipe可以在获得唯一文件名后附加扩展名)。 在模板中添加尽可能多的X

该文件没有创build,你需要自己创build它。 如果你有多个线程在同一个目录中创build独特的文件,你运行的竞争条件的可能性。 如果是这种情况,请使用mkstemp()来创build文件并返回文件描述符。

我使用当前date来生成给定扩展名的随机文件名。 这是我NSFileManager类别中的方法之一:

 +(NSString *)generateFileNameWithExtension:(NSString *)extensionString
 {
     //扩展string就像@“。png”

     NSDate *时间= [NSDatedate];
     NSDateFormatter * df = [NSDateFormatter new];
     [df setDateFormat:@“dd-MM-yyyy -hh-mm-ss”];
     NSString * timeString = [df stringFromDate:time];
     NSString * fileName = [NSString stringWithFormat:@“File  - %@%@”,timeString,extensionString];

    返回fileName;
 }

在iOS 6中,最简单的方法是使用:

 NSString *uuidString = [[NSUUID UUID] UUIDString]; 

这是我最终在Swift 3.0中使用的

 public func generateUniqueFilename (myFileName: String) -> String { let guid = ProcessInfo.processInfo.globallyUniqueString let uniqueFileName = ("\(myFileName)_\(guid)") print("uniqueFileName: \(uniqueFileName)") return uniqueFileName } 

这应该可能适合你:

http://vgable.com/blog/2008/02/24/creating-a-uuid-guid-in-cocoa/

该post的作者build议实施一个“stringWithUUID”方法作为NSString的一个类别。 只需将使用此方法生成的GUID追加到您正在创build的文件名的末尾即可。