objective c - ياهو - كيف أقوم بإنشاء ملف مؤقت مع Cocoa؟




مهمل فيس بوك (8)

قبل سنوات عندما كنت أعمل مع C # يمكنني بسهولة إنشاء ملف مؤقت والحصول على اسمه مع هذه الوظيفة:

Path.GetTempFileName();

تقوم هذه الوظيفة بإنشاء ملف باسم فريد في الدليل المؤقت وإرجاع المسار الكامل إلى ذلك الملف.

في واجهة برمجة تطبيقات Cocoa ، أقرب ما يمكنني العثور عليه هو:

NSTemporaryDirectory

هل أفتقد شيئًا واضحًا أم أنه لا يوجد بنى للقيام بذلك؟


أنا خلقت حل الكاكاو النقي عن طريق فئة على NSFileManager يستخدم مزيج من NSTemporary() ومعرف فريد عالميًا.

هنا ملف الرأس:

@interface NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory;

@end

وملف التنفيذ:

@implementation NSFileManager (TemporaryDirectory)

-(NSString *) createTemporaryDirectory {
 // Create a unique directory in the system temporary directory
 NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
 NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid];
 if (![self createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil]) {
  return nil;
 }
 return path;
}

@end

يؤدي هذا إلى إنشاء دليل مؤقت ولكن يمكن createFileAtPath:contents:attributes: بسهولة لاستخدام createFileAtPath:contents:attributes: بدلاً من createDirectoryAtPath: لإنشاء ملف بدلاً من ذلك.


إذا كنت تستهدف نظام التشغيل iOS 6.0 أو نظام التشغيل Mac OS X 10.8 أو أحدث:

NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];

الطريقة الحديثة للقيام بذلك هي url(for:in:appropriateFor:create:) FileManager url(for:in:appropriateFor:create:) .

باستخدام هذا الأسلوب ، يمكنك تحديد SearchPathDirectory نوع الدليل المؤقت الذي تريده بالضبط. على سبيل المثال ، .cachesDirectory بين عمليات التشغيل (قدر الإمكان) ويتم حفظها في مكتبة المستخدم ، بينما سيكون .itemReplacementDirectory على نفس وحدة التخزين كملف الهدف.


تم التحديث لـ Swift 3 ، وتم نسخها مباشرةً من Playground:

import Foundation

func pathForTemporaryFile(with prefix: String) -> URL {
    let uuid = UUID().uuidString
    let pathComponent = "\(prefix)-\(uuid)"
    var tempPath = URL(fileURLWithPath: NSTemporaryDirectory())
    tempPath.appendPathComponent(pathComponent)
    return tempPath
}

let url = pathForTemporaryFile(with: "blah")
print(url)

على الرغم من مرور عام تقريبًا ، فقد برزت أنه ما زال من المفيد ذكر مشاركة مدونة من Cocoa With Love by Matt Gallagher. cocoawithlove.com/2009/07/… كيفية استخدام mkstemp() للملفات و mkdtemp() ، كاملة مع تحويلات NSString.


قدمت شركة Apple طريقة ممتازة للوصول إلى دليل Temp وإنشاء أسماء فريدة للملفات المؤقتة.

- (NSString *)pathForTemporaryFileWithPrefix:(NSString *)prefix
{
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;

    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);

    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);

    result = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-%@", prefix, uuidStr]];
    assert(result != nil);

    CFRelease(uuidStr);
    CFRelease(uuid);

    return result;
}

LINK :::: http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 راجع الملف ::: AppDelegate.m


يمكنك استخدام NSTask إلى uuidgen للحصول على اسم ملف فريد ، ثم إلحاق ذلك إلى سلسلة من NSTemporaryDirectory() . هذا لن يعمل على Cocoa Touch. أنها قليلاً متعرج رغم ذلك.


[ملاحظة: ينطبق هذا على iPhone SDK ، وليس على Mac OS SDK]

من حيث يمكن أن أقول ، هذه الدالات غير موجودة في SDK (يتم unistd.h الملف unistd.h بشكل كبير لأسفل بالمقارنة مع ملف Mac OS X 10.5 القياسي). أود استخدام شيء على غرار ما يلي:

[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];

ليس أجمل ، ولكن وظيفية





file-io