usar puedo notas escribir crear abrir ios swift

ios - crear - no puedo escribir en notas iphone



Obtener una lista de archivos en la carpeta de documentos (6)

¿Qué tiene de malo mi código para obtener los nombres de archivo en la carpeta de documentos?

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 hay en la carpeta de documentos, pero "fileList" no muestra nada. "dir" muestra la ruta a la carpeta.


Apple declara sobre NSSearchPathForDirectoriesInDomains(_:_:_:) :

Debería considerar usar las urls(for:in:) métodos de urls(for:in:) y url(for:in:appropriateFor:create:) que devuelven URL, que son el formato preferido.

Con Swift 5, FileManager tiene un método llamado contentsOfDirectory(at:includingPropertiesForKeys:options:) . contentsOfDirectory(at:includingPropertiesForKeys:options:) tiene la siguiente declaración:

Realiza una búsqueda superficial del directorio especificado y devuelve URL para los elementos contenidos.

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

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

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)") }

Como 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 URL de los archivos guardados en el directorio de documentos:

import UIKit class ViewController: UIViewController { @IBAction func copyFile(_ sender: UIButton) { // Get file url guard let fileUrl = 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 file to document directory if !FileManager.default.fileExists(atPath: documentDirectoryFileUrl.path) { do { try FileManager.default.copyItem(at: fileUrl, to: documentDirectoryFileUrl) print("Copy item succeeded") } 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)") } } }


Compatibilidad con Swift 2.0

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 }


Esta solución funciona con Swift 4 (Xcode 9.2) y también con Swift 5 (Xcode 10.2.1+):

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)") }

Aquí hay una extensión reutilizable de FileManager que también te permite omitir o incluir archivos ocultos en los resultados:

import Foundation extension FileManager { func urls(for directory: FileManager.SearchPathDirectory, skipsHiddenFiles: Bool = true ) -> [URL]? { let documentsURL = urls(for: directory, in: .userDomainMask)[0] let fileURLs = try? contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil, options: skipsHiddenFiles ? .skipsHiddenFiles : [] ) return fileURLs } } // Usage print(FileManager.default.urls(for: .documentDirectory) ?? "none")


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

Alguna modificación de su 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])") } }


Una sintaxis 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


Swift 5

// 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) 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) }