36

Tôi cần một cách nhanh chóng và dễ dàng để lưu trữ tệp có tên tệp duy nhất trên iOS. Tôi cần tiền tố tệp bằng một chuỗi và sau đó nối thêm số nhận dạng duy nhất được tạo vào cuối. Tôi đã hy vọng NSFileManager đã có một số phương pháp thuận tiện để làm điều này, nhưng tôi dường như không thể tìm thấy nó.NSFileManager tên tệp duy nhất

Tôi đang xem createFileAtPath:contents:attributes:, nhưng tôi không chắc liệu các thuộc tính có cho tôi biết tên tệp duy nhất đó không.

+1

này [SO] [1] có thể là những gì bạn cần. [1]: http://stackoverflow.com/questions/215820/how-do-i-create-a-temporary-file-with-cocoa – user523234

Trả lời

75

Tạo tên tập tin riêng của bạn:

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

Một đơn giản thay thế được đề xuất bởi @darrinm trong các ý kiến:

NSString *prefixString = @"MyFilename"; 

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

NSLog(@"uniqueFileName: '%@'", uniqueFileName); 

NSLog đầu ra:
uniqueFileName: 'MyFilename_680E77F2-20B8-444E-875B -11453B06606E-688-00000145B460AF51 '

Lưu ý: iOS6 đã giới thiệu lớp NSUUID có thể được sử dụng thay cho CFUUID.

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

Một shortcut tốt đẹp để có được một chuỗi GUID là: NSString * guid = [[NSProcessInfo processInfo] globalUniqueString] – darrinm

+1

Thật tuyệt, nhưng xác suất va chạm là gì? – Arsynth

+0

@ user578205 Từ tài liệu: UUID được tạo duy nhất trên cả không gian và thời gian bằng cách kết hợp giá trị duy nhất với máy tính mà trên đó nó được tạo và giá trị biểu thị số lượng khoảng 100 nano giây. Có một lý do họ được gọi là "duy nhất". – zaph

7

Bạn cũng có thể sử dụng đáng kính mktemp() (xem man 3 mktemp). Như thế này:

- (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]; 
} 

Các XXXXX sẽ được thay thế bằng một sự kết hợp chữ cái/số độc đáo. Chúng chỉ có thể xuất hiện ở cuối mẫu, do đó bạn không thể có phần mở rộng được thêm vào trong mẫu (mặc dù bạn có thể chắp thêm nó sau khi lấy tên tệp duy nhất). Thêm nhiều số X như bạn muốn trong mẫu.

Tệp không được tạo, bạn cần tự tạo tệp. Nếu bạn có nhiều chủ đề tạo tệp duy nhất trong cùng một thư mục, bạn chạy khả năng có điều kiện chủng tộc. Nếu trường hợp này xảy ra, hãy sử dụng mkstemp() tạo tệp và trả về bộ mô tả tệp.

+2

Bạn thực sự có thể có phần mở rộng .. 'path = @" .../XXXXXX.pdf "' và sau đó thực hiện 'mkstemps (đường dẫn, suffixLength)'. 'suffixLength = 4' trong trường hợp này. – Marc

8

Tôi sử dụng ngày hiện tại để tạo tên tệp ngẫu nhiên với tiện ích mở rộng đã cho. Đây là một trong những phương pháp trong thể loại NSFileManager tôi:

 
+ (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

CẢNH BÁO: Việc sử dụng ngày có thể gây ra va chạm trong thời gian tiết kiệm ánh sáng ban ngày -1. (Vào mùa thu khi cùng một giờ được lặp lại.) – bob

+1

Để tránh va chạm khi thay đổi thời gian tiết kiệm ánh sáng ban ngày, chúng ta có thể nối thêm thông số "Z" vào chuỗi định dạng ngày (nó đại diện cho bù trừ múi giờ hiện tại). Có lẽ điều này sẽ giúp ai đó. – Storix

5

Trong iOS 6 phương pháp đơn giản nhất là sử dụng:

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

Đây là những gì tôi đã kết thúc sử dụng trong Swift 3.0

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

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

    print("uniqueFileName: \(uniqueFileName)") 

    return uniqueFileName 
} 
+1

Đối với Swift 3: hãy để guid = ProcessInfo.processInfo.globallyUniqueString – user3717478

+0

Cảm ơn! Đã cập nhật câu trả lời của tôi. –

0

Super-đơn giản Swift 4 1-liner:

fileName = "MyFileName_" + UUID().uuidString 

hoặc

fileName = "MyFileName_" + ProcessInfo().globallyUniqueString 
Các vấn đề liên quan