NSFileManager唯一的文件名

时间:2011-10-13 19:11:02

标签: objective-c ios cocoa-touch uniqueidentifier file-management

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

我正在查看createFileAtPath:contents:attributes:,但我不确定属性是否会为我提供唯一的文件名。

9 个答案:

答案 0 :(得分:75)

创建自己的文件名:

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

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

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引入了NSUUID类,可用于代替CFUUID。

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

答案 1 :(得分:8)

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

答案 2 :(得分: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];
}

XXXXX将替换为唯一的字母/数字组合。它们只能出现在模板的末尾,因此您不能在模板中附加扩展名(尽管您可以在获取唯一文件名后附加它)。在模板中添加任意数量的X

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:4)

以下是我最终在Swift 3.0中使用的内容

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

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

    print("uniqueFileName: \(uniqueFileName)")

    return uniqueFileName
}

答案 5 :(得分:2)

这应该对你有用:

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

该帖子的作者建议将'stringWithUUID'方法实现为NSString的一个类别。只需将使用此方法生成的GUID附加到您正在创建的文件名的末尾。

答案 6 :(得分:1)

超级简单 Swift 4 1-liner:

fileName = "MyFileName_" + UUID().uuidString

fileName = "MyFileName_" + ProcessInfo().globallyUniqueString

答案 7 :(得分:1)

在Swift 4.2中,我使用了两个选项,一个大多数是唯一的但可读的,另一个是唯一的。

// Create a unique filename, added to a starting string or not
public func uniqueFilename(filename: String = "") -> String {
    let uniqueString = ProcessInfo.processInfo.globallyUniqueString
    return filename + "-" + uniqueString
}

// Mostly Unique but Readable ID based on date and time that is URL compatible ("unique" to nearest second)
public func uniqueReadableID(name: String = "") -> String {

    let timenow = DateFormatter.localizedString(from: Date(), dateStyle: .medium, timeStyle: .medium)
    let firstName = name + "-" + timenow
    do {
        // Make ID compatible with URL usage
        let regex = try NSRegularExpression(pattern: "[^a-zA-Z0-9_]+", options: [])
        let newName = regex.stringByReplacingMatches(in: firstName, options: [], range: NSMakeRange(0, firstName.count), withTemplate: "-")
        return newName
    }
    catch {
        print(" Unique ID Error: \(error.localizedDescription)")
        return uniqueFilename(filename: name)
    }
}

答案 8 :(得分:0)

迅速4.1。只需通过文件扩展名即可,函数将返回唯一的文件名。

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
    }