【问题标题】:Swift 3.0 FileManager.fileExists(atPath:) always return falseSwift 3.0 FileManager.fileExists(atPath:) 总是返回 false
【发布时间】:2017-08-11 09:23:32
【问题描述】:

当我使用方法.fileExists(atPath:)判断文件是否存在于文件系统中时,该方法总是返回false给我。我检查了文件系统,文件确实存在。这是我的代码:

let filePath = url?.path
var isDir : ObjCBool = false
if(self.fileManager.fileExists(atPath: filePath!, isDirectory: &isDir)){
     let result = NSData(contentsOfFile: filePath!)
}

let filePath = url?.path
if(self.fileManager.fileExists(atPath: filePath!)){
     let result = NSData(contentsOfFile: filePath!)
}

if 子句总是会被跳过。

【问题讨论】:

  • 您是否指向文件所在的确切文件位置??
  • filePath 的值是多少?是以~开头的吗?如果是这样,您首先需要调用扩展的波浪号InPath
  • @user3608500 是的,指向一个确切的文件,我想判断这个文件是否存在。
  • @mlidal 以“/Users/De....”开头
  • 可能路径不正确?请检查网址

标签: ios swift nsfilemanager


【解决方案1】:

我假设您的 urlURL 类型。如果是这样试试这个:

let filePath = url?.path  // always try to work with URL when accessing Files
if(FileManager.default.fileExists(atPath: filePath!)){  // just use String when you have to check for existence of your file
    let result = NSData(contentsOf: url!)  // use URL instead of String
}

说得够多了,你应该像这样改变你的实现:

if(FileManager.default.fileExists(atPath: (url?.path)!)){  // just use String when you have to check for existence of your file
    let result = NSData(contentsOf: url!)  // use URL instead of String
}

编辑:1

还有更好的方法,你可以称之为 swift-way (:D)。您不必明确检查文件是否存在

guard let result = NSData(contentsOf: fileURL) else {
    // No data in your fileURL. So no data is received. Do your task if you got no data
    // Keep in mind that you don't have access to your result here.
    // You can return from here. 
    return
}
// You got your data successfully that was in your fileURL location. Do your task with your result.
// You can have access to your result variable here. You can do further with result constant.
print(result)

没有 Objective-Cish NS 前缀的 Swift 3.0+ 更新:

do {
    let result = try Data(contentsOf: fileURL)
    print(result)
} catch {
    print(error)
}

【讨论】:

  • 太棒了!就我而言,我使用的是.absoluteString 而不是.path。这解决了它
  • 使用 .path 是我的关键,而不是 .absoluteString。
【解决方案2】:

swift 3 中 以防万一有人像我一样感到困惑,这是完整的 sn-ps:

let str = "file:///Users/martian2049/Library/Developer/CoreSimulator/Devices/67D744AA-6EEC-4AFD-A840-366F4D78A18C/data/Containers/Data/Application/DD96F423-AF9F-4F4D-B370-94ADE7D6D0A5/Documents/72b8b0fb-7f71-7f31-ac9b-f9cc95dfe90d.mp3"

let url = URL(string: str)
print(url!.path,"\n")

if FileManager.default.fileExists(atPath: url!.path) {
    print("FILE Yes AVAILABLE")
} else {
    print("FILE NOT AVAILABLE")
}

打印出来

/Users/martian2049/Library/Developer/CoreSimulator/Devices/67D744AA-6EEC-4AFD-A840-366F4D78A18C/data/Containers/Data/Application/DD96F423-AF9F-4F4D-B370-94ADE7D6D0A5/Documents/72b8b0fb-7f71-7f31-ac9b-f9cc95dfe90d.mp3 

FILE Yes AVAILABLE

注意“file://”是如何被砍掉的?

【讨论】:

  • 老实说,如果我可以回去,我会改为学习 OC。 swift 几乎不是一种通用语言
  • 指出file:// 被砍掉是必不可少的。非常感谢。
【解决方案3】:

我想分享我的经验,以防其他人对此感到困惑。

在 iOS 10-11、Xcode 9.2 和 Swift 3.2 上测试。

简短回答:如果您将文件路径保存到磁盘,则可以通过不包括 Documents 目录来解决。 相反,每次您需要使用保存的路径检索文件时,获取 Documents 目录并附加路径。


对于 iOS 应用程序,我通过相对 URL 将图像保存到 .../Documents/Pictures,比如说url。 当图像被保存时,一个路径,比如url.path,也被保存在一个核心数据实体中。

当我后来尝试通过FileManager.default.fileExists(atPath: url.path) 检索图像时,它总是返回 false。

我正在我的 iPhone 上测试该应用程序。原来,由于某种原因,每次我从 Xcode 运行应用程序时,应用程序标识符文件夹都会改变!

所以:

  • 从 Xcode 打开的应用程序 -> 保存的图像 -> 应用程序关闭 -> 从物理设备打开的应用程序 -> 文件存在 -> 真
  • 应用从 Xcode 打开 -> 图像保存 -> 应用关闭 -> 应用从 Xcode 打开 -> fileExists -> FALSE

您可以通过获取并打印文档文件夹路径(或 URL,没关系)并将其与保存的路径(或 URL)进行比较来检查您的情况。如果你得到这样的东西:

  • /var/mobile/Containers/Data/Application/5D4632AE-C432-4D37-A3F7-ECD05716AD8A/Documents..
  • /var/mobile/Containers/Data/Application/D09904C3-D80D-48EB-ACFB-1E42D878AFA4/Documents..

你找到了问题。

【讨论】:

  • 这对我来说是正确的解释。也许添加一些代码来保存和检索图像以供其他寻求帮助的人使用。
  • 这解决了我的问题。更令人困惑的是,当您下载容器并看到该文件存在时。
  • 这应该是这里接受的答案。大多数其他答案都是stackoverflow.com/questions/34135305/…的重复
  • 对我来说就是这种情况。谢谢。
【解决方案4】:

只需使用 path 而不是 absoluteString 来删除 file://

FileManager.default.fileExists(atPath: URL.init(string: "your_url")!.path)

【讨论】:

    【解决方案5】:
     let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true);
        var path = paths[0] as String;
        path = path + "/YourFilePath"
        if((NSFileManager.defaultManager().fileExistsAtPath(path))) {
                 let result = NSData(contentsOfFile: filePath!)}
    

    试试上面的代码,再检查一遍

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,这对我有用

      filePath.replacingOccurrences(of: "file://", with: "")
      

      【讨论】:

        【解决方案7】:
        1. 首先,您的文件路径是什么样的?如果路径以~开头,则必须以expandingTildeInPath展开;
        2. 检查您的应用程序是否无法访问该路径。 iOS 应用只能访问其沙盒目录。

        【讨论】:

        • 1.Path 是 "/Users/De/Library/Developer/CoreSimulator/Devices/~~~/Documents/Cache/qbyNPuA.mp3" , 2.这个文件是代码写的所以我觉得它是可访问的。
        猜你喜欢
        • 2016-01-15
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2021-11-05
        • 2018-11-05
        • 2019-05-06
        • 2017-04-29
        相关资源
        最近更新 更多