Obteniendo la lista de archivos en la carpeta de documentos

¿Qué hay de malo en mi código para obtener los nombres de los archivos en la carpeta del documento?

func listFilesFromDocumentsFolder() -> [NSString]?{ var theError = NSErrorPointer() let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if dirs != nil { let dir = dirs![0] as NSString let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir, error: theError) as [NSString] return fileList }else{ return nil } } 

Pensé que había leído los documentos correctamente y estoy muy seguro de lo que está en la carpeta de documentos, pero “fileList” no muestra nada. “dir” muestra la ruta a la carpeta.

Aquí hay una solución que funcionará con Swift 4 / Xcode 9.2:

 let fileManager = FileManager.default let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] do { let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil) // process files } catch { print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)") } 

Xcode 8.1 • Swift 3.0.1

 // Get the document directory url let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! do { // Get the directory contents urls (including subfolders urls) let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsUrl, includingPropertiesForKeys: nil, options: []) print(directoryContents) // if you want to filter the directory contents you can do like this: let mp3Files = directoryContents.filter{ $0.pathExtension == "mp3" } print("mp3 urls:",mp3Files) let mp3FileNames = mp3Files.map{ $0.deletingPathExtension().lastPathComponent } print("mp3 list:", mp3FileNames) } catch { print(error.localizedDescription) } 

Una syntax más corta para SWIFT 3

 func listFilesFromDocumentsFolder() -> [String]? { let fileMngr = FileManager.default; // Full path to documents directory let docs = fileMngr.urls(for: .documentDirectory, in: .userDomainMask)[0].path // List all contents of directory and return as [String] OR nil if failed return try? fileMngr.contentsOfDirectory(atPath:docs) } 

Ejemplo de uso:

 override func viewDidLoad() { print(listFilesFromDocumentsFolder()) } 

Probado en xCode 8.2.3 para iPhone 7 con iOS 10.2 y iPad con iOS 9.3

Apple afirma sobre NSSearchPathForDirectoriesInDomains(_:_:_:) :

Debe considerar usar las urls(for:in:) métodos de urls(for:in:) y url(for:in:appropriateFor:create:) cuáles URL de devolución, que son el formato preferido.


Con Swift 3, FileManager tiene un método llamado contentsOfDirectory(at:includingPropertiesForKeys:options:) . contentsOfDirectory(at:includingPropertiesForKeys:options:) tiene la siguiente statement:

Realiza una búsqueda superficial en el directorio especificado y devuelve las URL de los elementos contenidos.

 func contentsOfDirectory(at url: URL, includingPropertiesForKeys keys: [URLResourceKey]?, options mask: FileManager.DirectoryEnumerationOptions = []) throws -> [URL] 

Por lo tanto, para recuperar las direcciones URL de los archivos contenidos en el directorio de documentos, puede usar el siguiente fragmento de código que utiliza los FileManager urls(for:in:) y contentsOfDirectory(at:includingPropertiesForKeys:options:) FileManager:

 guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } do { let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: []) // Print the urls of the files contained in the documents directory print(directoryContents) } catch { print("Could not search for urls of files in documents directory: \(error)") } 

A modo de ejemplo, la implementación de UIViewController continuación muestra cómo guardar un archivo del paquete de aplicaciones en el directorio de documentos y cómo obtener las direcciones URL de los archivos guardados en el directorio de documentos:

 import UIKit class ViewController: UIViewController { @IBAction func copyFile(_ sender: UIButton) { // Get app bundle file url guard let bundleFileUrl = Bundle.main.url(forResource: "Movie", withExtension: "mov") else { return } // Create a destination url in document directory for file guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let documentDirectoryFileUrl = documentsDirectory.appendingPathComponent("Movie.mov") // Copy bundle file to document directory if !FileManager.default.fileExists(atPath: documentDirectoryFileUrl.path) { do { try FileManager.default.copyItem(at: bundleFileUrl, to: documentDirectoryFileUrl) } catch { print("Could not copy file: \(error)") } } } @IBAction func displayUrls(_ sender: UIButton) { guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } do { let directoryContents = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: []) // Print the urls of the files contained in the documents directory print(directoryContents) // may print [] or [file:///private/var/mobile/Containers/Data/Application/.../Documents/Movie.mov] } catch { print("Could not search for urls of files in documents directory: \(error)") } } } 

Swift 2.0 Compability

 func listWithFilter () { let fileManager = NSFileManager.defaultManager() // We need just to get the documents folder url let documentsUrl = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL do { // if you want to filter the directory contents you can do like this: if let directoryUrls = try? NSFileManager.defaultManager().contentsOfDirectoryAtURL(documentsUrl, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsSubdirectoryDescendants) { print(directoryUrls) ........ } } } 

O

  func listFiles() -> [String] { var theError = NSErrorPointer() let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if dirs != nil { let dir = dirs![0] do { let fileList = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir) return fileList as [String] }catch { } }else{ let fileList = [""] return fileList } let fileList = [""] return fileList } 

Este código imprime todos los directorios y archivos en mi directorio de documentos:

Algunas modificaciones de tu función:

 func listFilesFromDocumentsFolder() -> [String] { var theError = NSErrorPointer() let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] if dirs != nil { let dir = dirs![0] let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(dir, error: theError) return fileList as! [String] // edit: added ! for Swift 1.2 compatibitily }else{ let fileList = [""] return fileList } } 

Que se llama por:

  let fileManager:NSFileManager = NSFileManager.defaultManager() var fileList = listFilesFromDocumentsFolder() let count = fileList.count var isDir:Bool = true; for var i:Int = 0; i < count; i++ { if fileManager.fileExistsAtPath(fileList[i]) != true { println("File is \(fileList[i])") } }