NSFileManager唯一的文件名

spe*_*tak 37 cocoa-touch objective-c uniqueidentifier file-management ios

我需要一种快速简便的方法来在iOS上存储具有唯一文件名的文件.我需要在文件前添加一个字符串,然后将生成的唯一标识符附加到末尾.我希望NSFileManager有一些方便的方法来做到这一点,但我似乎无法找到它.

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

zap*_*aph 75

创建自己的文件名:

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

@darrinm在评论中提出的更简单的替代方案:

NSString *prefixString = @"MyFilename";

NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ;
NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@", prefixString, guid];

NSLog(@"uniqueFileName: '%@'", uniqueFileName);
Run Code Online (Sandbox Code Playgroud)

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

注意:iOS6引入了NSUUID类,可用于代替CFUUID.

NSString *guid = [[NSUUID new] UUIDString];
Run Code Online (Sandbox Code Playgroud)

  • 获取GUID字符串的一个很好的快捷方式是:NSString*guid = [[NSProcessInfo processInfo] globalUniqueString] (12认同)
  • 这很好,但是碰撞的概率是多少? (2认同)
  • 唯一的潜在问题是,如果您以超过每 100 纳秒的速度生成 UUID,这在当今的处理器上可能是不可能的。此外 srand() 及其家族并不擅长随机数,arc4random() 是获取随机数的方法。 (2认同)

wzb*_*zon 10

我使用当前日期生成具有给定扩展名的随机文件名.这是我的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;
}

  • 警告:在夏令时-1期间使用日期可能会导致碰撞.(在同一小时重复的秋天.) (3认同)

ovi*_*diu 7

你也可以使用古老的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];
}
Run Code Online (Sandbox Code Playgroud)

XXXXX会以独特的字母/数字组合所取代.它们只能出现在模板的末尾,因此您不能在模板中附加扩展名(尽管您可以在获取唯一文件名后附加它).X在模板中添加任意数量的内容.

该文件未创建,您需要自己创建.如果您有多个线程在同一目录中创建唯一文件,则可能存在竞争条件.如果是这种情况,请使用mkstemp()创建文件并返回文件描述符.

  • 你实际上可以有一个扩展名.`path = @".../XXXXXX.pdf"`然后执行`mkstemps(path,suffixLength)`.在这种情况下,`suffixLength = 4`. (2认同)

dre*_*ter 7

超级简单的Swift 4 1-liner:

fileName = "MyFileName_" + UUID().uuidString
Run Code Online (Sandbox Code Playgroud)

或者

fileName = "MyFileName_" + ProcessInfo().globallyUniqueString
Run Code Online (Sandbox Code Playgroud)


Ree*_*ing 5

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

NSString *uuidString = [[NSUUID UUID] UUIDString];
Run Code Online (Sandbox Code Playgroud)


Dav*_*evy 5

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

public func generateUniqueFilename (myFileName: String) -> String {

    let guid = ProcessInfo.processInfo.globallyUniqueString
    let uniqueFileName = ("\(myFileName)_\(guid)")

    print("uniqueFileName: \(uniqueFileName)")

    return uniqueFileName
}
Run Code Online (Sandbox Code Playgroud)