2014-12-31 26 views
67

Co jest nie tak z moim kodem dla uzyskania nazw plików w folderze dokumentu?Uzyskiwanie listy plików w folderze dokumentów

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

myślałem czytałem dokumenty poprawnie i jestem bardzo pewny tego, co znajduje się w folderze dokumentów, ale „fileList” nie pokazuje nic? "dir" pokazuje ścieżkę do folderu.

+0

chcesz pokazać również nazwy plików znajdujących się w katalogu dokumentów lub pliki znajdujące się w folderach? –

+0

najpierw tylko pliki w folderze dokumentu! – pawi

+0

Po prostu uruchomiłem twój kod i działało zgodnie z oczekiwaniami. Mam listę tego, co jest w moim katalogu dokumentów. Czy źle rozumiemy twoje pytanie? – jwlaughton

Odpowiedz

11

Oto rozwiązanie, które będzie pracować z 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 \(destinationFolder.path): \(error.localizedDescription)") 
} 
184

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) 
} 
+0

Dla ludzi, którzy są tak nieostrożni jak ja. Zauważ, że wywołanie: FileManager.default.contentsOfDirectory (atPath: <#T##String#>) może nie działać poprawnie z nieznanych przyczyn w Swift 3.0. Użyj powyższego tutaj. –

3

Kod ten wypisuje wszystkie katalogi i pliki w moim katalogu dokumentów:

Niektóre modyfikacje swojej funkcji:

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

Który jest wywoływany przez:

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

Swift 2,0 Kompatybilność

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

    } 

} 

lub

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 

} 
11

krótszy składni 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) 
} 

Przykład zastosowania:

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

Testowane na Xcode 8.2.3 dla iPhone z iOS 7 10.2 & iPad z iOS 9.3

3

firmy Apple twierdzi o NSSearchPathForDirectoriesInDomains(_:_:_:):

Należy rozważyć zastosowanie metod urls(for:in:)FileManager i url(for:in:appropriateFor:create:) które zwracają adresy URL, które są preferowany format.


szybkimi 3 FileManager ma metodę zwaną contentsOfDirectory(at:includingPropertiesForKeys:options:). contentsOfDirectory(at:includingPropertiesForKeys:options:) ma następującą deklarację:

Wykonuje płytkie wyszukiwanie określonego katalogu i zwraca adresy URL zawartych elementów.

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

Dlatego też, w celu pobrania adresów URL z plików znajdujących się w katalogu dokumentów, można użyć następującego fragmentu kodu, który używa FileManager „s urls(for:in:) i contentsOfDirectory(at:includingPropertiesForKeys:options:) metody:

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

Poniżej przykładowa implementacja UIViewController pokazuje, jak zapisać plik z m app pakiet do katalogu dokumentów i jak uzyskać adresy URL pliki zapisane w folderze Dokumenty:

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

} 
Powiązane problemy