NSFileManager.contentsOfDirectoryAtURL 返回的文件根据 NSFileManager.fileExistsAtPath 不存在?
Posted
技术标签:
【中文标题】NSFileManager.contentsOfDirectoryAtURL 返回的文件根据 NSFileManager.fileExistsAtPath 不存在?【英文标题】:Files returned by NSFileManager.contentsOfDirectoryAtURL do not exist according to NSFileManager.fileExistsAtPath? 【发布时间】:2015-06-16 13:32:12 【问题描述】:新版本
在 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
找到,但不能通过NSFileManager
的fileExistsAtPath
函数找到。而且我也找不到阅读它们的方法。请帮忙。
还要注意,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
是我放在包中的文件的名称。该文件显然存在,因为它的 URL 是由 contentsOfDirectoryAtURL
为文件夹 bundle.resourceURL!
返回的,但错误表明它不存在!同样使用NSFileManager.defaultManager().fileExistsAtPath(i)
测试是否存在返回false
。
请注意,文本文件blurredTest.text
位于iOS 框架中以及读取类MyClass
中的代码(上)。
那么我该如何读取那个文件呢?
【问题讨论】:
@RizwanShaikh 这个答案会谈为完全不同的问题提供了解决方案——我的文件实际上只是一个文件,而不是目录。 【参考方案1】:从NSFileManager
的contentsOfDirectoryAtURL
返回的数组是包含传入路径目录中每个文件名称的字符串。例如,如果您的包路径是/MyGreatApp/Resources/
,并且其中有一个名为SomeText.txt
的文件,则从contentsOfDirectoryAtURL
返回的数组将是SomeText.txt
,而不是/MyGreatApp/Resources/SomeText.txt
。因此,当您从数组中抓取一个项目并询问文件管理器是否存在时,它会查看 /SomeText.txt
而不是文件实际所在的 /MyGreatApp/Resources/SomeText.txt
。
如果您从contentsOfDirectoryAtURL
获得的数组中的每个结果都将其附加到捆绑网址的末尾,您应该会看到更好的结果。
【讨论】:
我认为这不是正确的解决方案。在检查文件是否存在之前,我对contentsOfDirectoryAtURL
返回的每个NSURL
调用absoluteString
。这有效地将相对于 bundle 资源目录的路径扩展为绝对路径,但fileExistsAtPath
check 仍然返回false
。但是,我可能只是误解了您的答案。能否提供代码示例?
在您现有的打印行之前添加它,它应该会为您解决问题:print("\((fileUrl as! NSURL).absoluteString!)")
。如果您有完整的路径,那么还有其他问题,如果没有,您需要尝试更像:var url = bundle.resourceURL!; url = url.URLByAppendingPathComponent(fileURL!); print("\(NSFileManager.defaultManager().fileExistsAtPath(url.path)")
我已经这样做了 - 我有完整的路径。无论如何,谢谢你的想法。以上是关于NSFileManager.contentsOfDirectoryAtURL 返回的文件根据 NSFileManager.fileExistsAtPath 不存在?的主要内容,如果未能解决你的问题,请参考以下文章