获取目录中多个文件的内容

问题描述 投票:-1回答:2

我需要从多个plist文件中获取内容并将它们放入单个dictionary中,然后显示在tableView

使用此代码,我可以手动获取文件的每个路径和内容,但我需要能够对目录中的所有plist文件执行此操作,而不仅仅是这些预定义的文件。

    func getFiles() {
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let path = documentDirectory.appending("/MainFolder/File1.plist")
    let path1 = documentDirectory.appending("/MainFolder/File2.plist")
    let path2 = documentDirectory.appending("/MainFolder/File3.plist")
    tableViewData = [NSDictionary(contentsOfFile: path) as! [String : String], NSDictionary(contentsOfFile: path1) as! [String : String], NSDictionary(contentsOfFile: path2) as! [String : String]]
    print(tableViewData)
}

我在我的tableViewData中显示tableView,它给了我自己行上的每个文件内容。

我猜我可能需要一个由.plist过滤的文件网址数组,然后以某种方式将每个文件的内容放入[String : String]字典中。

我是新手,任何帮助或更好的方法都可以做到这一点

swift macos nstableview
2个回答
0
投票

首先,不要在Swift中使用过时的和客观的c-ish NSSearchPathForDirectoriesInDomains。使用modernFileManager API。

其次,不要使用objective-c-ish NSDictionary(contentsOf来读取属性列表数据。使用PropertyListSerialization

函数throws意味着它将所有可能的错误移交给调用者。它通过plist扩展名过滤目录中的URL,并使用map函数获取每个URL的字典。

func getFiles() throws {
    let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    let subFolderURL = documentDirectory.appendingPathComponent("MainFolder")
    let allFiles = try FileManager.default.contentsOfDirectory(at: subFolderURL, includingPropertiesForKeys: nil)
    let properListFiles = allFiles.filter{$0.pathExtension == "plist"}
    tableViewData = try properListFiles.compactMap { url -> [String:String]? in
        let data = try Data(contentsOf: url)
        return try PropertyListSerialization.propertyList(from: data, format: nil) as? [String:String]
    }
    print(tableViewData)
}

请注意,在沙盒应用程序中,Documents文件夹位于应用程序容器中。


0
投票

你可以阅读所有的plists并迭代它们将它们的内容添加到1个数组或者已经保存的字典中。

do {

let directoryContents = try FileManager.default.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: [])


let allPlistFiles = directoryContents.filter{ $0.pathExtension == "plist" }
var aPlistArray = []
for aPlist in allPlistFiles {
aPlistArray.append(NSDictionary(contentsOfFile: path) as! [String : String])
}

} catch {
    print(error)
}
© www.soinside.com 2019 - 2024. All rights reserved.