Vérifier si NSURL est un répertoire
Lors de l'utilisation de Swift, je veux vérifier si une NSURL
emplacement est un répertoire. Avec Objective-C, ce n'est pas un problème et de travail à trouver, mais quand je convertis le code Swift que je tombe sur une erreur d'exécution.
Peut-être que quelqu'un peut me pointer dans la bonne direction?
import Foundation
let defaultManager = NSFileManager.defaultManager()
let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
let localDocumentURLs = defaultManager.contentsOfDirectoryAtURL(documentsDirectory,
includingPropertiesForKeys: nil, options: .SkipsPackageDescendants, error: nil) as NSURL[]
for url in localDocumentURLs {
var isError: NSError? = nil
var isDirectory: AutoreleasingUnsafePointer<AnyObject?> = nil
var success: Bool = url.getResourceValue(isDirectory, forKey: NSURLIsDirectoryKey, error: &isError)
}
d'où vient l'erreur d'exécution se passer exactement?
OriginalL'auteur alex | 2014-06-13
Vous devez vous connecter pour publier un commentaire.
qui travaille en citer bien de mon côté:
REMARQUE: il vérifie si le
Documents
dossier est un dossier. vous pouvez remplacer l'URL par quoi que ce soit, bien sûr.oui,
fileExistsAtPath()
retourne si le chemin d'accès n'existe pas, leisDirectory
tiendra l'info si oui ou non le chemin d'accès est un dossier.L'homme... je faisais
var isDir:ObjCBool = false
au lieu devar isDir:ObjCBool = ObjCBool(0)
maintenant, je comprends quefalse
ettrue
sont auto-pontés à NSNumber pas ObjCBool.OriginalL'auteur holex
Dans iOS 9.0+ et macOS 10.11+ il y a une propriété dans
NSURL
/URL
Swift:
Objective-C:
La question a été posée et répondue en 2014, iOS 9 a été libéré un an plus tard
Eh bien, c'est LA réponse aujourd'hui. Si souvent je obtenir frappé ici avec la bonne réponse, d'être quelque part entre les deux, et pas sur le dessus.
Cette propriété n'a pas l'air au système de fichiers pour savoir si l'URL pointe effectivement vers un répertoire:
URL(string: "file:///var/")!.hasDirectoryPath
esttrue
(notez le point à la/
), tandis queURL(string: "file:///var")!.hasDirectoryPath
estfalse
. La vérification de laresourceValues
est la meilleure approche.OriginalL'auteur vadian
Swift 3
OriginalL'auteur Madmoron
Voici la swift version 2.0 de l'affiche originale du code:
OriginalL'auteur Eli Burke
mes 2 cents ...
swift NSURL: (basé sur holex réponse)
OriginalL'auteur BananaAcid
Beaucoup de réponses ici... mais ils ont tous une chose en commun:
Ils utilisent tous
FileManager
(qui est en faitNSFileManger
).Cette approche a un inconvénient:
FileManager
n'est pas thread-safe! À l'aide d'unFileManager
de différents threads en parallèle travaille généralement pour des opérations passives, mais qui n'est nulle part garantie (vous pourriez être la construction sur un comportement indéfini lorsque vous comptez que cela fonctionne).Une mise en œuvre sûre serait de créer un nouveau
FileManager
instance à chaque fois, et pourtant, ce serait horrible de la performance, ou utilisation de l'un par thread, ce qui est énorme surcharge de gestion.Il existe une bien meilleure, beaucoup plus simple d'approche que je voudrais présenter ici, qui n'a pas besoin d'un 3ème partie de la classe:
Que c'est. À l'aide de la
resourceValues()
méthode, vous pouvez également facilement requête autres informations intéressantes, comme la taille d'un fichier ou la date de dernière modification. Ceci est une très puissante API, qui existe pour les âges pourNSURL
en Obj-C et de l'.OriginalL'auteur Mecki
... et c'est un Swift 3 extension sur
FileManager
:OriginalL'auteur Klaas
... et la swift 3 approche comme une extension d'URL:
OriginalL'auteur user3600066