获取目录中多个文件的内容
Get the Contents of multiple files in directory
我需要从多个 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)
}
我在我的 tableView
中显示 tableViewData
,它让我在自己的行中显示每个文件的内容。
我猜我可能需要一个由 .plist
过滤的文件 url 数组,然后通过某种方式将每个文件的内容放入 [String : String]
字典中。
我是 swift 的新手,任何帮助或更好的方法都很好
您可以读取所有 plist 并遍历它们,将它们的内容添加到 1 个数组或已保存的字典中。
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: [])
let allPlistFiles = directoryContents.filter{ [=10=].pathExtension == "plist" }
var aPlistArray = []
for aPlist in allPlistFiles {
aPlistArray.append(NSDictionary(contentsOfFile: path) as! [String : String])
}
} catch {
print(error)
}
首先不要在Swift中使用过时的objective-c-ish NSSearchPathForDirectoriesInDomains
。使用现代FileManager
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{[=10=].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
文件夹位于应用程序容器中。
我需要从多个 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)
}
我在我的 tableView
中显示 tableViewData
,它让我在自己的行中显示每个文件的内容。
我猜我可能需要一个由 .plist
过滤的文件 url 数组,然后通过某种方式将每个文件的内容放入 [String : String]
字典中。
我是 swift 的新手,任何帮助或更好的方法都很好
您可以读取所有 plist 并遍历它们,将它们的内容添加到 1 个数组或已保存的字典中。
do {
let directoryContents = try FileManager.default.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: [])
let allPlistFiles = directoryContents.filter{ [=10=].pathExtension == "plist" }
var aPlistArray = []
for aPlist in allPlistFiles {
aPlistArray.append(NSDictionary(contentsOfFile: path) as! [String : String])
}
} catch {
print(error)
}
首先不要在Swift中使用过时的objective-c-ish NSSearchPathForDirectoriesInDomains
。使用现代FileManager
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{[=10=].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
文件夹位于应用程序容器中。