2016-11-03 1 views
0

FULLPATH WennGet fullpath oder konvertieren

mit
let directoryEnumerator = FileManager().enumerator(at: ... 

in Swift 3, erhalte ich alle Dateien aus dem Ordner, z.B.

"file:///Volumes/MacOS/fasttemp/Fotos/" 

Die Ergebnisse umfassen nicht die führenden Pfad (hier "/ Volumes/MacOS"). So bekomme ich

Wie kann ich den vollständigen Pfad (direkt aus dem Enumerator) oder konvertieren Sie sie. Ich möchte URL-Funktionen verwenden, nicht die String-Funktion, die nach Annahmen manipuliert.

+0

"/ Volumes/MacOS" ist ein symbolischer Link auf "/", so beide "/ FastTemp/Fotos/2005 /" und „/ Volumes/MacOS/fasttemp/Fotos/"sind absolute Pfade zu derselben Datei. –

+0

Gibt es eine Funktion, um eine bestimmte Repräsentation für eine Datei zu erhalten? Ich vergleiche sie gerne, z. benutze sie als Schlüssel. Wenn sie unterschiedliche Darstellungen als String verwenden, wird das fehlschlagen. – Peter71

Antwort

2

Wenn „MacOS“ ist der Name des aktuellen Startdiskette dann „/ Volumes/MacOS“ ein symbolischer Link ist zu "/", also sind sowohl "/ fasttemp/Fotos/2005 /" als auch "/ Volumes/MacOS/fasttemp/Fotos /" absolute Pfade zu derselben Datei.

Um eine eindeutige Dateinamenrepräsentation zu erhalten, können Sie eine URL für ihren kanonischen Pfad abfragen. Beispiel:

let url = URL(fileURLWithPath: "/Volumes/MacOS/Applications/Utilities/") 
if let cp = (try? url.resourceValues(forKeys: [.canonicalPathKey]))?.canonicalPath { 
    print(cp) 
} 
// Output: "/Applications/Utilities" 

Dies erfordert macOS 10.12/iOS 10 oder höher. Auf älteren Systemen können Sie den Anruf realpath() System verwenden:

if let rp = url.withUnsafeFileSystemRepresentation ({ realpath($0, nil) }) { 
    let fullUrl = URL(fileURLWithFileSystemRepresentation: rp, isDirectory: true, relativeTo: nil) 
    free(rp) 
    print(fullUrl.path) 
} 
// Output: "/Applications/Utilities" 
+0

Ausgezeichnet, das war's: "canonicalPath". Danke vielmals! – Peter71

+0

Ups, habe gerade die Information bekommen, dass diese Funktion nur unter OSX 10.12 verfügbar ist! Gibt es etwas Ähnliches für> = 10.9? – Peter71

+0

@ Peter71: Siehe Update. –

0

Beachten Sie, dass Sie URL verwenden, wo immer möglich, von den NSURL documentation:

URL-Objekte sind die bevorzugte Art und Weise auf lokale Dateien zu verweisen. Die meisten Objekte, die Daten aus einer Datei lesen oder in eine Datei schreiben, haben Methoden, die ein NSURL-Objekt anstelle eines Pfadnamens als Dateireferenz akzeptieren.

Hier ist ein Beispiel dafür, wie alle Objekte aus einem Verzeichnis zu erhalten:

import Foundation 

let manager = FileManager.default 

// Get URL for the current user’s Documents directory 
// Use URL instead of path, it’s more flexible and preferred 
if let documents = manager.urls(for: .documentDirectory, in: .userDomainMask).first, 

    // Get an Enumerator for the paths of all the objects in the directory 
    // but do not descend into directories or packages 
    let directoryEnumerator = manager.enumerator(at: documents, includingPropertiesForKeys: [URLResourceKey.pathKey], options: [.skipsSubdirectoryDescendants, .skipsPackageDescendants]) { 

    // iterate through the objects (files, directories, etc.) in the directory 
    for path in directoryEnumerator { 
    print(path) 
    } 
} 
+0

Genau das hatte ich vor (und was ich getan habe). Ich suche nach einer Konvertierungsfunktion von einer langen (expliziten) zu einer kurzen Version (nur "/"), ohne sie auf String-Basis zu schreiben. – Peter71

Verwandte Themen