年前,當我與C#的工作,我可以很容易地創建一個臨時文件,這個功能得到它的名字:如何使用Cocoa創建臨時文件?
Path.GetTempFileName();
該功能將在臨時目錄中創建一個唯一名稱的文件,並返回全該文件的路徑。
在Cocoa API的,我能找到的最接近的是:
NSTemporaryDirectory
我失去了一些東西明顯或有沒有內置的方式做到這一點?
年前,當我與C#的工作,我可以很容易地創建一個臨時文件,這個功能得到它的名字:如何使用Cocoa創建臨時文件?
Path.GetTempFileName();
該功能將在臨時目錄中創建一個唯一名稱的文件,並返回全該文件的路徑。
在Cocoa API的,我能找到的最接近的是:
NSTemporaryDirectory
我失去了一些東西明顯或有沒有內置的方式做到這一點?
安全的方法是使用mkstemp(3)。
@Chris Hanson:什麼,沒有x-man-page:// 3/mkstemp鏈接? ;-) – 2008-10-19 09:39:57
http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html – 2009-09-22 17:32:06
[注:這適用於iPhone的SDK,而在Mac OS SDK]
從我可以告訴,這些功能是不存在的SDK(該unistd.h
文件被大大削減下來的時候與標準的Mac OS X 10.5文件相比)。我會用線沿線的東西:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
不是最漂亮的,但功能
這具有相同的爭用條件如mktemp的(3):從創建的分離的文件名的建立臨時文件打開一個漏洞窗口。正如格雷厄姆李建議的那樣使用mkstemp(3)。 – 2008-10-19 03:54:49
對不起,我是在iPhone模式下;原始海報建議的mkstemp(3)很好,但它不適用於iPhone。 – 2008-10-19 11:44:11
你可以使用一個NSTask
來uuidgen
得到一個唯一的文件名,然後附加,爲了一個字符串從NSTemporaryDirectory()
。這在Cocoa Touch上不起作用。雖然有點囉嗦。
雖然差不多一年之後,我仍然認爲馬特加拉格爾提到可可愛的博客文章仍然很有幫助。 http://cocoawithlove.com/2009/07/temporary-files-and-folders-in-cocoa.html他演示瞭如何使用mkstemp()
的文件和mkdtemp()
目錄,完成NSString轉換。
我通過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:
創建一個文件來代替。
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中。米
添加到@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;
}
如果靶向的iOS 6.0或Mac OS X 10.8或更高:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
更新了夫特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)
現代的方式做,這是FileManager
的url(for:in:appropriateFor:create:)
。
使用這種方法,你可以指定一個SearchPathDirectory
說你想要什麼樣的臨時目錄中。例如,一個.cachesDirectory
將保持運行(儘可能)並保存在用戶的庫中,而.itemReplacementDirectory
將與目標文件位於同一捲上。
使用C#API時的警告字:它有一個只有65k文件的命名空間,並且一旦耗盡就會拋出異常。這種情況發生在我們的生產中 - 並非所有程序都在認真清理臨時文件。 – fzwo 2016-12-25 09:18:48