2008-10-19 40 views
37

年前,當我與C#的工作,我可以很容易地創建一個臨時文件,這個功能得到它的名字:如何使用Cocoa創建臨時文件?

Path.GetTempFileName(); 

該功能將在臨時目錄中創建一個唯一名稱的文件,並返回全該文件的路徑。

在Cocoa API的,我能找到的最接近的是:

NSTemporaryDirectory 

我失去了一些東西明顯或有沒有內置的方式做到這一點?

+0

使用C#API時的警告字:它有一個只有65k文件的命名空間,並且一旦耗盡就會拋出異常。這種情況發生在我們的生產中 - 並非所有程序都在認真清理臨時文件。 – fzwo 2016-12-25 09:18:48

回答

36

安全的方法是使用mkstemp(3)

+2

@Chris Hanson:什麼,沒有x-man-page:// 3/mkstemp鏈接? ;-) – 2008-10-19 09:39:57

+10

http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html – 2009-09-22 17:32:06

2

您可以使用mktemp來獲取臨時文件名。

+5

mktemp(3)中存在競爭條件,最好使用mkstemp(3)。 – 2008-10-19 01:38:41

19

[注:這適用於iPhone的SDK,而在Mac OS SDK]

從我可以告訴,這些功能是不存在的SDK(該unistd.h文件被大大削減下來的時候與標準的Mac OS X 10.5文件相比)。我會用線沿線的東西:

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

不是最漂亮的,但功能

+5

這具有相同的爭用條件如mktemp的(3):從創建的分離的文件名的建立臨時文件打開一個漏洞窗口。正如格雷厄姆李建議的那樣使用mkstemp(3)。 – 2008-10-19 03:54:49

+0

對不起,我是在iPhone模式下;原始海報建議的mkstemp(3)很好,但它不適用於iPhone。 – 2008-10-19 11:44:11

0

你可以使用一個NSTaskuuidgen得到一個唯一的文件名,然後附加,爲了一個字符串從NSTemporaryDirectory()。這在Cocoa Touch上不起作用。雖然有點囉嗦。

11

我通過NSFileManager上的類別創建了一個純Cocoa解決方案,該類別使用了NSTemporary()和全局唯一ID的組合。

這裏頭文件:

@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

Apple爲訪問臨時目錄和爲臨時文件創建唯一名稱提供了一種絕佳方式。

- (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中。米

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或Mac OS X 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

現代的方式做,這是FileManagerurl(for:in:appropriateFor:create:)

使用這種方法,你可以指定一個SearchPathDirectory說你想要什麼樣的臨時目錄中。例如,一個.cachesDirectory將保持運行(儘可能)並保存在用戶的庫中,而.itemReplacementDirectory將與目標文件位於同一捲上。