iPad应用开发技术问询:如何从临时文件获取所有已保存PDF的URL和名称并转换为NSObject
解决iPad应用中读取Documents目录所有PDF并封装为NSObject的问题
看起来你在处理iPad应用里PDF的存储和读取时卡壳了——能成功把PDF写入Documents目录,但不知道怎么把所有已保存PDF的URL和名称封装成NSObject类型的对象。先帮你捋捋原读取代码里的问题,再给你完整的解决方案:
首先,你的读取代码有两个关键错误:
- 你构造的
pathURL是直接在Documents目录下拼接了.pdf,这其实是在找一个名叫.pdf的文件,而不是遍历目录里所有的PDF文件 - 尝试用
String(contentsOf:)读取PDF文件完全不对,PDF是二进制格式,不能直接转成字符串来遍历
下面是一步步的解决办法:
1. 先定义NSObject子类来存PDF信息
我们先创建一个继承自NSObject的类,专门用来保存每个PDF的URL和名称,这样后续处理起来更方便:
class PDFItem: NSObject { let fileURL: URL let fileName: String init(fileURL: URL, fileName: String) { self.fileURL = fileURL self.fileName = fileName super.init() } }
2. 写方法遍历目录并封装所有PDF
接下来实现一个方法,遍历Documents目录下的所有文件,筛选出PDF格式的,然后把每个PDF的信息封装成上面定义的PDFItem对象:
func getAllSavedPDFItems() -> [PDFItem] { var pdfItems = [PDFItem]() // 获取Documents目录的URL let documentsDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] do { // 获取目录下所有文件的URL let allFileURLs = try FileManager.default.contentsOfDirectory(at: documentsDirectoryURL, includingPropertiesForKeys: nil) // 筛选出后缀为pdf的文件 for fileURL in allFileURLs { if fileURL.pathExtension.lowercased() == "pdf" { // 获取不带后缀的文件名 let fileName = fileURL.deletingPathExtension().lastPathComponent // 创建PDFItem对象并存入数组 let pdfItem = PDFItem(fileURL: fileURL, fileName: fileName) pdfItems.append(pdfItem) } } } catch { print("读取Documents目录失败: \(error.localizedDescription)") } return pdfItems }
3. 调用示例
现在你可以这样调用这个方法,拿到所有封装好的PDF信息:
let allSavedPDFs = getAllSavedPDFItems() // 遍历打印每个PDF的信息 for pdf in allSavedPDFs { print("PDF名称: \(pdf.fileName)") print("PDF路径: \(pdf.fileURL.absoluteString)") }
再回头说下原代码的问题
- 你之前构造的
pathURL是错误的,appendingPathComponent(".pdf")生成的是一个不存在的文件路径,自然读不到内容 - PDF是二进制数据,用
String(contentsOf:)读取会导致数据乱码,而且这种方式根本不是用来获取目录下文件列表的,完全找错方向了
这样修改后,你就能正确获取所有已保存的PDF文件信息,并且都封装成NSObject类型的对象了。
内容的提问来源于stack exchange,提问作者aig_88
相关产品推荐
相关产品推荐

