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 找到,但不能通过NSFileManagerfileExistsAtPath 函数找到。而且我也找不到阅读它们的方法。请帮忙。

还要注意,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】:

NSFileManagercontentsOfDirectoryAtURL 返回的数组是包含传入路径目录中每个文件名称的字符串。例如,如果您的包路径是/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 不存在?的主要内容,如果未能解决你的问题,请参考以下文章