每次打开应用程序时,FileManager 的路径 URL 不同[重复]

问题描述 投票:0回答:2

我想在fileManager根路径下创建一个文件夹,但是在创建之前,我想检查该文件夹是否存在,如果不存在,我就创建,否则就保留它

这是我使用的功能

public func isDirectoryExist(path: String) -> Bool {
    let fileManager = FileManager.default
    var isDir : ObjCBool = false
    if fileManager.fileExists(atPath: path, isDirectory:&isDir) {
        if isDir.boolValue {
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}


public func createNewDirectory(name: String) {
    
    let DocumentDirectory = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
    let DirPath = DocumentDirectory.appendingPathComponent(name)
    do
    {
        try FileManager.default.createDirectory(atPath: DirPath!.path, withIntermediateDirectories: true, attributes: nil)
    }
    catch let error as NSError
    {
        Logger.logError("Unable to create directory \(error.debugDescription)")
    }
    Logger.logInfo("Dir Path = \(DirPath!)")
}

现在,当我检查现有文件夹时,它总是错误的并创建一个新文件夹,并且每次都会发生

    func createARObjectDirectory() {
        let rootURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
        if isDirectoryExist(path: "\(rootURL.absoluteString)\(DefaultURL.arObjectUrlDirectoryName)") {
            Logger.logServer("ARObject directly found")
        } else {
            createNewDirectory(name: DefaultURL.arObjectUrlDirectoryName)
        }
    }

然后我打印根url,似乎url中间的哈希值总是不同,我如何检查它?

 file:///var/mobile/Containers/Data/Application/5AD0690B-498D-4309-8BD0-191FB88766AC/Documents/AR-Object/
 file:///var/mobile/Containers/Data/Application/41D35A54-1807-417E-AE29-311D43FCC21D/Documents/AR-Object/
 file:///var/mobile/Containers/Data/Application/F7E385CC-7921-4C37-B9BF-BCEFFC2AEE9E/Documents/AR-Object/
 file:///var/mobile/Containers/Data/Application/4748B014-5E55-46BB-BC83-394A6BC27292/Documents/AR-Object/

感谢您的帮助

swift nsfilemanager
2个回答
2
投票

您使用了错误的 API。

absoluteString
(在
rootURL.absoluteString
中)返回包含方案
file://
的字符串表示形式。文件系统 URL 的正确 API 是
path

我建议尽可能使用URL相关的API

public func directoryExists(at url: URL) -> Bool {
    let fileManager = FileManager.default
    var isDir : ObjCBool = false
    if fileManager.fileExists(atPath: url.path, isDirectory:&isDir) {
        return isDir.boolValue
    } else {
        return false
    }
}

并以更可靠的方式编写 URL

func createARObjectDirectory() {
    let documentsDirectory = URL.documentsDirectory
    if directoryExists(at: documentsDirectory.appendingPathComponent(DefaultURL.arObjectUrlDirectoryName)  {
        Logger.logServer("ARObject directly found")
    } else {
        createNewDirectory(name: DefaultURL.arObjectUrlDirectoryName)
    }
}

这也更快捷

public func createNewDirectory(name: String) {
    
    let documentsDirectory = URL.documentsDirectory
    let dirURL = documentsDirectory.appendingPathComponent(name)
    do
    {
        try FileManager.default.createDirectory(at: dirURL, withIntermediateDirectories: false, attributes: nil)
    }
    catch let error as NSError
    {
        Logger.logError("Unable to create directory \(error.debugDescription)")
    }
    Logger.logInfo("Dir Path = \(dirPath.path)")
}
  

1
投票

应用程序文档目录的实际路径可能会发生变化。您应该使用文档目录中的相对路径,而不是尝试比较运行之间的路径。

(我相信每次重建或重新安装应用程序时路径都会发生变化,但对于应用程序商店构建而言{相当}稳定。)

您是说您在文档目录中创建的目录在运行之间消失了?这不应该是真的。文档目录的内容应该保留。

© www.soinside.com 2019 - 2024. All rights reserved.