Parcourez les fichiers d’un dossier et de ses sous-dossiers à l’aide du gestionnaire de fichiers de Swift.

Je suis assez nouveau pour programmer un Swift et j’essaie de parcourir les fichiers d’un dossier. J’ai jeté un coup d’oeil à la réponse ici et j’ai essayé de le traduire en syntaxe Swift, mais sans succès.

let fileManager = NSFileManager.defaultManager() let enumerator:NSDirectoryEnumerator = fileManager.enumeratorAtPath(folderPath) for element in enumerator { //do something } 

l’erreur que je reçois est la suivante:

 Type 'NSDirectoryEnumerator' does not conform to protocol 'SequenceType' 

Mon but est de regarder tous les sous-dossiers et fichiers contenus dans le dossier principal et de trouver tous les fichiers avec une certaine extension pour ensuite faire quelque chose avec eux.

Utilisez la méthode nextObject() de l’ enumerator :

 while let element = enumerator?.nextObject() as? Ssortingng { if element.hasSuffix("ext") { // checks the extension } } 

Aujourd’hui (début 2017), il est fortement recommandé d’utiliser l’API – plus polyvalente – liée à l’URL

 let fileManager = FileManager.default do { let resourceKeys : [URLResourceKey] = [.creationDateKey, .isDirectoryKey] let documentsURL = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) let enumerator = FileManager.default.enumerator(at: documentsURL, includingPropertiesForKeys: resourceKeys, options: [.skipsHiddenFiles], errorHandler: { (url, error) -> Bool in print("directoryEnumerator error at \(url): ", error) return true })! for case let fileURL as URL in enumerator { let resourceValues = try fileURL.resourceValues(forKeys: Set(resourceKeys)) print(fileURL.path, resourceValues.creationDate!, resourceValues.isDirectory!) } } catch { print(error) } 

Je ne pouvais pas trouver la solution de pNre pour travailler du tout; la boucle while n’a jamais rien reçu. Cependant, j’ai trouvé cette solution qui fonctionne pour moi (dans Xcode 6 beta 6, alors peut-être que les choses ont changé depuis que pNre a publié la réponse ci-dessus?):

 for url in enumerator!.allObjects { print("\((url as! NSURL).path!)") } 

Au cas où vous obtenez le

‘NSDirectoryEnumerator?’ n’a pas de membre nommé erreur ‘nextObject’

la boucle while devrait être:

 while let element = enumerator?.nextObject() as? Ssortingng { // do things with element } 

Cela a quelque chose à voir avec le chaînage en option

Swift 3

 let fd = FileManager.default fd.enumerator(atPath: "/Library/FileSystems")?.forEach({ (e) in if let e = e as? Ssortingng, let url = URL(ssortingng: e) { print(url.pathExtension) } }) 

Swift3 + URL absolues

 extension FileManager { func listFiles(path: Ssortingng) -> [URL] { let baseurl: URL = URL(fileURLWithPath: path) var urls = [URL]() enumerator(atPath: path)?.forEach({ (e) in guard let s = e as? Ssortingng else { return } let relativeURL = URL(fileURLWithPath: s, relativeTo: baseurl) let url = relativeURL.absoluteURL urls.append(url) }) return urls } } 

Basé sur le code de @ user3441734

SWIFT 3.0

Renvoie tous les fichiers avec extension dans le répertoire passé et ses sous-répertoires

 func extractAllFile(atPath path: Ssortingng, withExtension fileExtension:Ssortingng) -> [Ssortingng] { let pathURL = NSURL(fileURLWithPath: path, isDirectory: true) var allFiles: [Ssortingng] = [] let fileManager = FileManager.default let pathSsortingng = path.replacingOccurrences(of: "file:", with: "") if let enumerator = fileManager.enumerator(atPath: pathSsortingng) { for file in enumerator { if #available(iOS 9.0, *) { if let path = NSURL(fileURLWithPath: file as! Ssortingng, relativeTo: pathURL as URL).path, path.hasSuffix(".\(fileExtension)"){ let fileNameArray = (path as NSSsortingng).lastPathComponent.components(separatedBy: ".") allFiles.append(fileNameArray.first!) } } else { // Fallback on earlier versions print("Not available, #available iOS 9.0 & above") } } } return allFiles } 

renvoie tous les fichiers d’un répertoire

Swift 3

 let fileNames = try! FileManager.default.contentsOfDirectory(atPath: "/Volumes/Seagate/Path/") for fileName in fileNames { print(fileName) } 

Mise à jour pour Swift 3:

 let fileManager = FileManager() // let fileManager = NSFileManager.defaultManager() let en=fileManager.enumerator(atPath: the_path) // let enumerator:NSDirectoryEnumerator = fileManager.enumeratorAtPath(folderPath) while let element = en?.nextObject() as? Ssortingng { if element.hasSuffix("ext") { // do something with the_path/*.ext .... } } 

Ajout à la réponse de vadian – les documents Apple mentionnent que les URL basées sur le chemin d’access sont plus simples à certains égards. Cependant, les URL de référence de fichier ont l’avantage de conserver la référence si le fichier est déplacé ou renommé.

A partir de la documentation pour “Accéder aux fichiers et répertoires”:

“Les URL basées sur des chemins sont plus faciles à manipuler, plus faciles à déboguer et sont généralement préférées par des classes telles que NSFileManager. Un avantage des URL de référence de fichier est qu’elles sont moins fragiles que les URL basées sur des chemins lorsque votre application est exécutée. déplace un fichier dans le Finder, toute URL basée sur le chemin faisant référence au fichier devient immédiatement invalide et doit être mise à jour vers le nouveau chemin. Cependant, tant que le fichier est déplacé vers un autre emplacement sur le même disque, son identifiant unique modifier et toute URL de référence de fichier rest valide. ”

https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html

Si vous voulez vérifier catégoriquement si un élément est un fichier ou un sous-répertoire:

 let enumerator = FileManager.default.enumerator(atPath: contentsPath); while let element = enumerator?.nextObject() as? Ssortingng { if(enumerator?.fileAtsortingbutes?[FileAtsortingbuteKey.type] as! FileAtsortingbuteType == FileAtsortingbuteType.typeRegular){ //this is a file } else if(enumerator?.fileAtsortingbutes?[FileAtsortingbuteKey.type] as! FileAtsortingbuteType == FileAtsortingbuteType.typeDirectory){ //this is a sub-directory } } 

Récemment éprouvé des difficultés avec un tableau d’URL, qu’il s’agisse d’un répertoire ou non (par exemple, glisser-déposer). Terminé avec cette extension dans swift 4, peut être utile

 extension Sequence where Iterator.Element == URL { var handleDir: [URL] { var files: [URL] = [] self.forEach { u in guard u.hasDirectoryPath else { return files.append(u.resolvingSymlinksInPath()) } guard let dir = FileManager.default.enumerator(at: u.resolvingSymlinksInPath(), includingPropertiesForKeys: nil) else { return } for case let url as URL in dir { files.append(url.resolvingSymlinksInPath()) } } return files } } 

Évitez les URL de référence, même si elles présentent certains avantages, comme indiqué ci-dessus, elles consumnt des ressources système et si vous énumérez un système de fichiers volumineux (pas très volumineux), votre application atteindra rapidement le