Vor Jahren, als ich mit C # arbeitete, konnte ich leicht eine temporäre Datei erstellen und ihren Namen mit dieser Funktion erhalten:
Path.GetTempFileName();
Diese Funktion erstellt eine Datei mit einem eindeutigen Namen im temporären Verzeichnis und gibt den vollständigen Pfad zu dieser Datei zurück.
In den Cocoa APIs kann ich am nächsten Folgendes finden:
NSTemporaryDirectory
Fehlt mir etwas Offensichtliches oder gibt es keine eingebaute Möglichkeit, dies zu tun?
Ein sicherer Weg ist die Verwendung von mkstemp (3) .
[Hinweis: Dies gilt für das iPhone SDK, nicht für das Mac OS SDK]
Soweit ich das beurteilen kann, sind diese Funktionen im SDK nicht vorhanden (die unistd.h
-Datei ist im Vergleich zur Standard-Mac OS X 10.5-Datei drastisch reduziert). Ich würde etwas im Sinne von verwenden:
[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithFormat: @"%.0f.%@", [NSDate timeIntervalSinceReferenceDate] * 1000.0, @"txt"]];
Nicht das schönste, aber funktionell
Apple bietet eine hervorragende Möglichkeit, auf das temporäre Verzeichnis zuzugreifen und eindeutige Namen für die temporären Dateien zu erstellen.
- (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 Siehe Datei ::: AppDelegate.m
Obwohl es fast ein Jahr später ist, dachte ich, es wäre immer noch hilfreich, einen Blogbeitrag von Cocoa With Love von Matt Gallagher zu erwähnen. http://cocoawithlove.com/2009/07/temporary-files-and-folder-in-cocoa.html Er zeigt die Verwendung vonmkstemp()
für Dateien undmkdtemp()
für Verzeichnisse mit NSString-Konvertierungen.
Ich habe eine reine Cocoa-Lösung mit einer Kategorie auf NSFileManager
erstellt, die eine Kombination aus NSTemporary()
und einer weltweit eindeutigen ID verwendet.
Hier die Headerdatei:
@interface NSFileManager (TemporaryDirectory)
-(NSString *) createTemporaryDirectory;
@end
Und die Implementierungsdatei:
@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
Dadurch wird ein temporäres Verzeichnis erstellt, es kann jedoch leicht angepasst werden, um createFileAtPath:contents:attributes:
anstelle von createDirectoryAtPath:
zu verwenden, um stattdessen eine Datei zu erstellen.
Wenn Sie auf iOS 6.0 oder Mac OS X 10.8 oder höher zielen:
NSString *tempFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSUUID UUID] UUIDString]];
Aktualisiert für Swift 4.2, direkt von einem Spielplatz kopiert:
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)
Oder alternativ Ssswifts Oneliner:
let prefix = "blah"
let url2 = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(prefix)-\(UUID())")
print(url2)
Sie können mktemp verwenden, um einen temporären Dateinamen zu erhalten.
Der moderne Weg, dies zu tun, ist FileManager
s url(for:in:appropriateFor:create:)
.
Mit dieser Methode können Sie eine SearchPathDirectory
angeben, um genau zu sagen, welche Art von temporärem Verzeichnis Sie wünschen. Beispielsweise bleibt ein .cachesDirectory
zwischen den Läufen bestehen (soweit möglich) und wird in der Bibliothek des Benutzers gespeichert, während ein .itemReplacementDirectory
auf demselben Volume wie die Zieldatei liegt.
Sie können eine NSTask
bis uuidgen
verwenden, um einen eindeutigen Dateinamen zu erhalten, und diesen an eine Zeichenfolge aus NSTemporaryDirectory()
anhängen. Dies funktioniert bei Cocoa Touch nicht. Es ist allerdings etwas langatmig.
Hinzufügen zu @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;
}