在iOS应用中,我需要阅读放置在资源包中的几个文本文件。我在课程MyClass
中创建了以下测试代码:
private let bundle = NSBundle(forClass: MyClass.self)
private func testLoadResource() {
var error: NSError? = NSError()
for fileUrl in NSFileManager.defaultManager().contentsOfDirectoryAtURL(bundle.resourceURL!,
includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.allZeros, error: &error)! {
print("\(NSFileManager.defaultManager().fileExistsAtPath((fileUrl as! NSURL).absoluteString!)), ")
}
}
此代码的控制台输出为:
false, false, false, false, false, false, false, false, false, false, false
NSFileManager.defaultManager().contentsOfDirectoryAtURL
根据NSFileManager.defaultManager().fileExistsAtPath
找不到contentsOfDirectoryAtURL
找到的文件?怎么可能?
显然,我放在资源包中的资源文件可以由fileExistsAtPath
找到,但不能由NSFileManager
的{{1}}函数找到。我也找不到如何阅读它们的方法。请帮忙。
另请注意,我需要阅读的课程MyClass
(上面带有测试代码)和资源文本文件都位于iOS框架中。
在我的iOS应用程序中需要读取我放在资源包中的几个文本文件。但是,从代码中读取这些文件我遇到了很大的麻烦。我创建了以下测试代码:
private let bundle = NSBundle(forClass: MyClass.self)
private func testLoadResource() {
var error: NSError? = NSError()
if let k = NSFileManager.defaultManager().contentsOfDirectoryAtURL(bundle.resourceURL!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.allZeros, error: &error) {
for i in k {
println(String(contentsOfFile: (i as! NSURL).absoluteString!, encoding: NSUTF8StringEncoding, error: &error))
println(error)
}
}
}
对于我放在包中的所有文本文件,上面的代码会产生以下错误输出:
Optional(Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)"
UserInfo=0x17407aa40 {NSFilePath=file:///private/var/mobile/Containers/Bundle/Application/73BEA20A-FC36-46EB-B27B-2124FF24BAFD/EasyType.app/Frameworks/EasyTypeShared.framework/blurredTest.text,
NSUnderlyingError=0x17404e5b0 "The operation couldn’t be completed. No such file or directory"})
blurredTest.text
是我放在捆绑包中的文件的名称。该文件显然存在,因为contentsOfDirectoryAtURL
为文件夹bundle.resourceURL!
返回了其URL,但错误表明它不存在!同时使用NSFileManager.defaultManager().fileExistsAtPath(i)
测试是否存在false
。
请注意,文本文件blurredTest.text
位于iOS框架中,并且不能阅读课程MyClass
中的代码(上图)。
那么如何阅读该文件?
答案 0 :(得分:-1)
从NSFileManager
' s contentsOfDirectoryAtURL
返回的数组是包含传入路径目录中每个文件名称的字符串。例如,如果您的捆绑路径为/MyGreatApp/Resources/
并且您有一个名为SomeText.txt
的文件,那么从contentsOfDirectoryAtURL
返回的数组将是SomeText.txt
,而不是/MyGreatApp/Resources/SomeText.txt
。因此,当您从数组中获取项目并询问文件管理器是否存在时,它会查看文件实际所在的/SomeText.txt
而不是/MyGreatApp/Resources/SomeText.txt
。
如果您从contentsOfDirectoryAtURL
获取数组中的每个结果并将其附加到捆绑网址的末尾,您应该会看到更好的结果。