2008-10-19 12 views
37

साल पहले जब मैं के साथ सी # काम कर रहा था मैं आसानी से एक अस्थायी फ़ाइल बनाने और इस समारोह के साथ अपने नाम मिल सकता है:मैं कोको के साथ एक अस्थायी फ़ाइल कैसे बना सकता हूं?

Path.GetTempFileName(); 

इस समारोह अस्थायी निर्देशिका में एक अद्वितीय नाम के साथ एक फ़ाइल बना सकेगी और पूर्ण वापसी उस फ़ाइल के लिए पथ।

कोको एपीआई में, निकटतम बात मैं मिल सकती है:

NSTemporaryDirectory 

मैं कुछ याद आ रही हूँ स्पष्ट या वहाँ रास्ते में बनाया नहीं यह करने के लिए है?

+0

उस सी # एपीआई का उपयोग करते समय सावधानी बरतें: इसमें केवल 65k फाइलों का नामस्थान है और समाप्त हो जाने के बाद अपवाद फेंक देगा। यह हमारे उत्पादन में हुआ है - सभी कार्यक्रम अपनी अस्थायी फ़ाइलों को परिश्रम से साफ नहीं करते हैं। – fzwo

उत्तर

36

mkstemp(3) का उपयोग करने का एक सुरक्षित तरीका है।

+2

@ क्रिस हैन्सन: क्या, कोई एक्स-मैन-पेज: // 3/mkstemp लिंक? ;-) –

+10

http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html –

2

आप एक temp फ़ाइल नाम प्राप्त करने के लिए mktemp का उपयोग कर सकते हैं।

+5

mktemp (3) में दौड़ की स्थिति है, यह mkstemp (3) का उपयोग करना बेहतर है। –

19

[ध्यान दें: यह iPhone SDK पर लागू होता है, नहीं मैक ओएस एसडीके]

मैं क्या बता सकते हैं, इन कार्यों एसडीके में मौजूद नहीं हैं (unistd.h फ़ाइल काफी नीचे जब तैयार है मानक मैक ओएस एक्स 10.5 फ़ाइल की तुलना में)। मैं की तर्ज पर कुछ प्रयोग करेंगे:

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

नहीं सुंदर, लेकिन कार्यात्मक

+5

यह समान दौड़ की स्थिति है mktemp (3): फ़ाइल नाम के निर्माण से अलग करना अस्थायी फ़ाइल भेद्यता की एक खिड़की खुलती है। ग्राहम ली के सुझाव के रूप में mkstemp (3) का प्रयोग करें। –

+0

क्षमा करें, मैं आईफोन मोड में था; मूल पोस्टर द्वारा सुझाए गए mkstemp (3) ठीक है, लेकिन यह आईफोन पर काम नहीं करेगा। –

+2

आईफोन पर, प्रत्येक ऐप में फाइल सिस्टम का अपना उप-भाग होता है। NSTemporaryDirectory() ऐप बंडल के भीतर कुछ देता है। आप अभी भी अपने खिलाफ और किसी और चीज के खिलाफ दौड़ते हैं जिसमें आपके tmp dir में लिखने की अनुमति है, लेकिन मुझे लगता है कि यह केवल विशेषाधिकार प्राप्त प्रक्रिया है। – Ken

0

आप uuidgen के लिए एक NSTask का उपयोग एक अद्वितीय फ़ाइल नाम प्राप्त करने के लिए कर सकता है, तो NSTemporaryDirectory() से कि संलग्न एक स्ट्रिंग के लिए। यह कोको टच पर काम नहीं करेगा। हालांकि यह थोड़ा लंबा हवादार है।

+0

'uuidgen' निष्पादित करने के लिए' NSTask' का उपयोग करना थोड़ा अधिक है यदि आप चाहते हैं कि एक यूयूआईडी है। – dreamlax

+0

ध्यान दें कि 10.8+ में एनएसयूयूआईडी कक्षा है जो यूओआईडी को कोको जमीन छोड़कर w/o बनाने के लिए है: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUUID_Class/Reference/Reference.html – Jay

12

हालांकि लगभग एक साल बाद, मुझे लगा कि मैट गैलाघर द्वारा कोको विद लव से ब्लॉग पोस्ट का उल्लेख करना अभी भी सहायक है। http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html वह दिखाता है कि फ़ाइलों के लिए mkstemp() और mkdtemp() निर्देशिकाओं के लिए, एनएसएसटींग रूपांतरणों के साथ पूर्ण कैसे करें।

11

मैंने 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: बजाय createDirectoryAtPath: का उपयोग करने के बजाय एक फ़ाइल बनाने के लिए अनुकूलित किया जा सकता।

16

ऐप्पल ने अस्थायी निर्देशिका तक पहुंचने और अस्थायी फ़ाइलों के लिए अद्वितीय नाम बनाने का एक शानदार तरीका प्रदान किया है।

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

लिंक :::: http://developer.apple.com/library/ios/#samplecode/SimpleURLConnections/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009245 फ़ाइल देखें ::: AppDelegate।मीटर

0

@Philipp को जोड़ना:

- (NSString *)createTemporaryFile:(NSData *)contents { 
    // Create a unique file in the system temporary directory 
    NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString]; 
    NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:guid]; 
    if(![self createFileAtPath:path contents:contents attributes:nil]) { 
     return nil; 
    } 
    return path; 
} 
8

iOS 6.0 या मैक ओएस एक्स 10.8 या लक्षित कर तो उच्च:

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

स्विफ्ट 3 के लिए अपडेट किया गया, एक खेल का मैदान से सीधे कॉपी किया:

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) 
+1

यह कोड संख्या लंबा काम करता है, लेकिन समकक्ष संस्करण भी आसान है: 'यूआरएल (fileURLWithPath: NSTemporaryDirectory())। appendingPathComponent ("\ (उपसर्ग) - \ (UUID())") ' – Ssswift

+0

धन्यवाद @Ssswift ने थोड़ा और वर्बोज़ में उत्तर अपडेट किया तौर तरीका। –

1

ऐसा करने का आधुनिक तरीका FileManager का url(for:in:appropriateFor:create:) है।

इस विधि के साथ, आप यह कहने के लिए SearchPathDirectory निर्दिष्ट कर सकते हैं कि आप किस प्रकार की अस्थायी निर्देशिका चाहते हैं। उदाहरण के लिए, .cachesDirectory रनों (यथासंभव) के बीच जारी रहेगा और उपयोगकर्ता की लाइब्रेरी में सहेजा जाएगा, जबकि .itemReplacementDirectory लक्ष्य फ़ाइल के समान वॉल्यूम पर होगा।

संबंधित मुद्दे

 संबंधित मुद्दे