it-swarm.com.de

Wie erstelle ich eine temporäre Datei mit Cocoa?

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?

37
lfalin

Ein sicherer Weg ist die Verwendung von mkstemp (3) .

35
user23743

[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

20
Ben Gottlieb

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

16
muzz

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.

12
Quinn Taylor

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.

11
Philipp

Wenn Sie auf iOS 6.0 oder Mac OS X 10.8 oder höher zielen:

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

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)
3
Bart van Kuik

Sie können mktemp verwenden, um einen temporären Dateinamen zu erhalten.

2
Giao

Der moderne Weg, dies zu tun, ist FileManagers 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.

1
Ssswift

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.

0
alextgordon

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;
}
0
SwiftArchitect