wake-up-neo.net

Vorhandensein von Dateien mithilfe von NSURL testen

Snow Leopard führte viele neue Methoden ein, um mit NSURL-Objekten auf Dateien zu verweisen, nicht auf Pfadnamen oder FSRefs von Core Services.

Es gibt jedoch eine Aufgabe, für die ich keine URL-basierte Methode finden kann: Testen, ob eine Datei vorhanden ist. Ich suche nach einer URL-basierten Version von - [NSFileManager fileExistsAtPath:] . Wie diese Methode sollte YES zurückgegeben werden, wenn die URL etwas beschreibt, ob es sich um eine reguläre Datei, ein Verzeichnis oder etwas anderes handelt.

Ich könnte versuchen, verschiedene resource-Werte nachzuschlagen, aber es ist ausdrücklich nicht garantiert, dass es sie nicht gibt, wenn die Datei nicht vorhanden ist. Einige (zB NSURLEffectiveIconKey ) könnten teuer werden, wenn dies der Fall ist .

Ich könnte einfach den fileExistsAtPath: von NSFileManager verwenden, aber wenn es eine modernere Methode gibt, würde ich diese lieber verwenden.

Gibt es eine einfache Methode oder Funktion in Cocoa, CF oder Core Services, die garantiert oder dokumentiert ist, um festzustellen, ob eine bestimmte Datei- (oder Dateireferenz-) URL auf ein vorhandenes Dateisystemobjekt verweist?

70
Peter Hosey

NSURL hat diese Methode:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

Welche "Gibt zurück, ob die Ressource, auf die eine Datei-URL verweist, erreichbar ist

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
               isDirectory:NO];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    [[NSAlert alertWithError:err] runModal];
136
Elise van Looij

Unter iOS konnte ich keinen anderen Weg finden ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}
29

Hier ist die Swift 2 Antwort:

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)
10

Wenn Sie feststellen, ob eine bestimmte Datei- (oder Dateireferenz-) URL auf ein vorhandenes Dateisystemobjekt verweist, ist dies für Remoteressourcen inhärent teuer. Die 10,6-Apis (kein iPhoneOS) für diesen CFURLResourceIsReachable () und [NSURL checkResourceIsReachableAndReturnError:] sind beide synchron Selbst wenn Sie sie verwenden würden, würden Sie bei vielen Dateien immer noch einen erheblichen Verzögerungsaufwand in Betracht ziehen.

Sie sollten Ihre eigene asynchrone Überprüfungsroutine mit Zwischenspeicherung implementieren, die separat eine Liste gültiger Ressourcen erstellt.

Ansonsten die Hinweise für CFURLResourceIsReachable im Kopfzustand:

Ein Beispiel wäre die periodische Pflege des UI-Status, der abhängig ist über das Vorhandensein eines bestimmten Dokuments. Bei der Durchführung eines Wenn Sie beispielsweise eine Datei öffnen, ist es einfacher, das .__ auszuprobieren. Betriebs- und Fehlerbehandlungen als zuerst auf Erreichbarkeit prüfen.

2
valexa

Da NSURL mehr als lokale Dateisysteme darstellen kann, glaube ich nicht, dass es eine generische Methode gibt, die ihre Existenz zuverlässig testen kann. Zumindest enthält die Cocoa Foundation (soweit ich weiß) keine solche Funktion.

Wenn Sie nur mit lokalen Dateisystemen arbeiten, empfehle ich Ihnen, eine Kategorie für NSURL oder für NSFileManager mit einer urlExists:-Nachricht zu erstellen. Die NSURL würde in eine NSString (normalisierter Pfad) konvertiert und dann die [NSFileManager fileExistsAtPath:]-Nachricht aufgerufen.

1

In Swift können Sie die checkResourceIsReachable()-Methode verwenden, die leider true zurückgibt (falls die Datei erreichbar ist) oder einen Fehler auslöst (der erklärt, warum sie nicht erreichbar ist).

Verwenden Sie diese Syntax, um stattdessen einen Bool-Wert "true"/"false" zu erhalten:

let exists = (try? inputFile.checkResourceIsReachable()) ?? false

Wenn Sie den Fehler protokollieren möchten:

let exists: Bool
do {
  exists = try inputFile.checkResourceIsReachable()
} catch {
  exists = false
  print(error.localizedDescription)
}

Denken Sie daran, dass dies ein teurer Vorgang ist und unmittelbar danach veraltet sein kann (wenn ein anderer Prozess ein Laufwerk löscht oder eine Datenträger-Datei abmeldet, während Sie prüfen, ob ein solcher vorhanden ist).

Im Allgemeinen wird nicht empfohlen, zu überprüfen, ob eine Datei vorhanden ist. Versuchen Sie stattdessen einfach, eine Datei zu lesen oder in eine Datei zu schreiben, und behandeln Sie eventuelle Fehler anschließend, wenn sie fehlschlägt.

0
Abhi Beckert