Уникальные имена файлов NSFileManager
Мне нужен быстрый и простой способ хранения файлов с уникальными именами файлов в iOS. Мне нужно префикс файла со строкой, а затем добавить сгенерированный уникальный идентификатор до конца. Я надеялся, что у NSFileManager
был удобный способ сделать это, но я не могу найти его.
Я смотрел createFileAtPath:contents:attributes:
, но не уверен, что атрибуты дадут мне это уникальное имя файла.
Ответы
Ответ 1
Создайте собственное имя файла:
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];
Ответ 2
Я использую текущую дату для генерации произвольного имени файла с заданным расширением. Это один из методов в моей категории 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;
}
Ответ 3
Вы также можете использовать почтенный 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()
, который создает файл и возвращает файловый дескриптор.
Ответ 4
В iOS 6 простейшим методом является использование:
NSString *uuidString = [[NSUUID UUID] UUIDString];
Ответ 5
Вот что я в итоге использовал в Swift 3.0
public func generateUniqueFilename (myFileName: String) -> String {
let guid = ProcessInfo.processInfo.globallyUniqueString
let uniqueFileName = ("\(myFileName)_\(guid)")
print("uniqueFileName: \(uniqueFileName)")
return uniqueFileName
}
Ответ 6
Вероятно, это сработает для вас:
http://vgable.com/blog/2008/02/24/creating-a-uuid-guid-in-cocoa/
Автор сообщения предлагает внедрить метод 'stringWithUUID' как категорию NSString. Просто добавьте GUID, сгенерированный с помощью этого метода, в конец созданного вами имени файла.
Ответ 7
Супер-легкий Swift 4 1-вкладыш:
fileName = "MyFileName_" + UUID().uuidString
или же
fileName = "MyFileName_" + ProcessInfo().globallyUniqueString
Ответ 8
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)
}
}
Ответ 9
Свифт 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
}