我需要一种快速简便的方法来在iOS上存储具有唯一文件名的文件。我需要在文件前添加一个字符串,然后将生成的唯一标识符附加到末尾。我希望NSFileManager
有一些方便的方法来做到这一点,但我似乎无法找到它。
我正在查看createFileAtPath:contents:attributes:
,但我不确定属性是否会为我提供唯一的文件名。
答案 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
}