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的文件名的末尾即可。