【问题标题】:Get File List from sub folder of Documents Directory swift ios从文档目录swift ios的子文件夹获取文件列表
【发布时间】:2016-06-23 19:31:07
【问题描述】:

我正在使用此代码从文档目录中获取 PDF 文件列表。 现在,如果该文件夹存在,我想从 Document Directory 中名为“MyFiles”的文件夹中查找 PDF 文件列表。

我该怎么做??

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) as! [String]
        var count = fileList.count
        for var i = 0; i < count; i++
        {
            var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
            filePath = filePath.stringByAppendingPathComponent(fileList[i])
            let properties = [NSURLLocalizedNameKey, NSURLCreationDateKey, NSURLContentModificationDateKey, NSURLLocalizedTypeDescriptionKey]
            var attr = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: NSErrorPointer())
        }
        return fileList.filter{ $0.pathExtension == "pdf" }.map{ $0.lastPathComponent } as [String]
    }else{
        let fileList = [""]
        return fileList
    }
}

提前谢谢..

【问题讨论】:

  • 你应该问一个问题。不要要求别人为你编码

标签: ios swift directory document


【解决方案1】:

对于 Swift 4.2 - 5.0 使用 FileManager 上的扩展

extension FileManager {

func urls(for DocumentsDirectory : String) -> [URL]? {
    let dirs = urls(for: .documentDirectory, in: .userDomainMask)
        //this will give you the path to MyFiles
    let MyFilesPath = dirs[0].appendingPathComponent("/" + DocumentsDirectory)

    let fileList = try? contentsOfDirectory(at: MyFilesPath, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)       
    return fileList
}}

【讨论】:

    【解决方案2】:

    对于 Swift 3

        let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let myFilesPath = documentDirectoryPath.appending("/Inbox")
        let files = FileManager.default.enumerator(atPath: myFilesPath)
    
        while let file = files?.nextObject() {
            print("\(myFilesPath)/\(file)")
        }
    

    【讨论】:

      【解决方案3】:

      这是工作代码..

      func listFilesFromDocumentsFolder() -> [String]
      {
          var theError = NSErrorPointer()
          let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
      
          if dirs != nil {
              let dir = dirs![0]//this path upto document directory
      
              //this will give you the path to MyFiles
              let MyFilesPath = dir.stringByAppendingPathComponent("/BioData")
              if !NSFileManager.defaultManager().fileExistsAtPath(MyFilesPath) {
                  NSFileManager.defaultManager().createDirectoryAtPath(MyFilesPath, withIntermediateDirectories: false, attributes: nil, error: theError)
              } else {
                  println("not creted or exist")
              }
      
              let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(MyFilesPath, error: theError) as! [String]
      
              var count = fileList.count
              for var i = 0; i < count; i++
              {
                  var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
                  filePath = filePath.stringByAppendingPathComponent(fileList[i])
                  let properties = [NSURLLocalizedNameKey, NSURLCreationDateKey, NSURLContentModificationDateKey, NSURLLocalizedTypeDescriptionKey]
                  var attr = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: NSErrorPointer())
              }
              println("fileList: \(fileList)")
              return fileList.filter{ $0.pathExtension == "pdf" }.map{ $0.lastPathComponent } as [String]
          }else{
              let fileList = [""]
              return fileList
          }
      }
      

      【讨论】:

        【解决方案4】:

        我认为这可以通过实现对实现 SequenceType 协议的 NSFileManager 的扩展来实现。但是您可以轻松地将代码转换为使用 while 循环:

        // path to documents directory
        let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
        let myFilesPath = documentDirectoryPath.stringByAppendingPathComponent("/MyFiles")
        let files = filemanager.enumeratorAtPath(myFilesPath)
        while let file = files?.nextObject() {
             println(file)
        }
        

        【讨论】:

        • 我想要只在“MyFiles”文件夹中的文件列表。
        • 被低估的答案。
        【解决方案5】:

        试试下面的代码:

            func listFilesFromDocumentsFolder() -> [String]
            {
                var theError = NSErrorPointer()
                let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
        
                if dirs != nil {
                    let dir = dirs![0]//this path upto document directory
        
                    //this will give you the path to MyFiles
                    let MyFilesPath = documentDirectory.stringByAppendingPathComponent("/MyFiles")
        
        
                    let fileList = NSFileManager.defaultManager().contentsOfDirectoryAtPath(MyFilesPath, error: theError) as! [String]
                    var count = fileList.count
                    for var i = 0; i < count; i++
                    {
                        var filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
                        filePath = filePath.stringByAppendingPathComponent(fileList[i])
                        let properties = [NSURLLocalizedNameKey, NSURLCreationDateKey, NSURLContentModificationDateKey, NSURLLocalizedTypeDescriptionKey]
                        var attr = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: NSErrorPointer())
                    }
                    return fileList.filter{ $0.pathExtension == "pdf" }.map{ $0.lastPathComponent } as [String]
                }else{
                    let fileList = [""]
                    return fileList
                }
            }
        

        【讨论】:

        • 确保将 NSFileManager 调用包装在 do-try-catch 语法中
        • 如果该文件夹不存在,上面编写的代码将使应用程序崩溃。
        • 是的,但至少你可以像 Koren 所说的那样通过 try-catch 或检查文件夹是否存在来自己做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 2015-02-27
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 2010-12-26
        相关资源
        最近更新 更多