每次启动/重新运行应用程序时,iOS 文件路径都会发生变化

2023-12-02

我在每次启动应用程序时更改文件路径时遇到问题。 我在应用程序包中有一个文件(“AppConstant.json”),我需要将该文件复制到应用程序文档目录中。我成功地将“AppConstant.json”文件保存在文档目录中创建的用户文件夹“MyFolder”中。

但问题是当我第二次重新启动应用程序时,它没有显示相同的路径。我也使用相对路径,但仍然没有得到。

这是代码 // 调用目录

let stringAppConstant = copyFileFromBundleToDocumentDirectory(resourceFile: "AppConstant", resourceExtension: "json")

// 保存或获取退出文件路径

func copyFileFromBundleToDocumentDirectory(resourceFile: String, resourceExtension: String) -> String 
  {
        var stringURLPath = "Error_URLPath"
        let fileManager = FileManager.default
        let docURL = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        let destFolderPath = URL(string:docURL)?.appendingPathComponent("MyFolder")
        let fileName = "\(resourceFile).\(resourceExtension)"
        guard let newDestPath = destFolderPath, let sourcePath = Bundle.main.path(forResource: resourceFile, ofType: ".\(resourceExtension)"), let fullDestPath = NSURL(fileURLWithPath: newDestPath.absoluteString).appendingPathComponent(fileName) else {
            return stringURLPath
        }

       if !fileManager.fileExists(atPath: newDestPath.path) {
            do {
                try fileManager.createDirectory(atPath: newDestPath.path,withIntermediateDirectories: true, attributes: nil)
                print("Created folder successfully in :::", newDestPath.path)
            } catch {
                print("Error in creating folder :::",error.localizedDescription);
            }
        }
        else {
            print("Folder is already exist!")
        }
        if fileManager.fileExists(atPath: fullDestPath.path) {
            print("File is exist in ::: \(fullDestPath.path)")
            stringURLPath = fullDestPath.path
        }
        else {
            do {
                try fileManager.copyItem(atPath:  sourcePath, toPath: fullDestPath.path)
                print("Saved file successfully in :::", fullDestPath.path)
                stringURLPath = fullDestPath.path
            } catch {
                print("Error in creating file ::: \(error.localizedDescription)")
            }
        }
        return stringURLPath
    }

请帮助我,我需要在沙盒中保存路径。这是我实施的正确方法吗?

我在设备和模拟器中运行,重新启动时两条路径不同 这是第一次启动的路径: /var/mobile/Containers/Data/Application/81B568A7-0932-4C3E-91EB-9DD62416DFE8/Documents/MyFolder/AppConstant.json

重新启动应用程序我得到新路径: /var/mobile/Containers/Data/Application/3DAABAC3-0DF5-415B-82A5-72B204311904/Documents/MyFolder/AppConstant.json

注意:我创建了一个示例项目,并使用相同的代码并且它正在工作。但在现有项目中它不起作用。我仅对示例和项目使用相同的包 ID 和配置文件。检查添加的文件参考、设置、版本均相同。

任何想法?


容器路径周期性变化的行为是正常的。

这些行

let destFolderPath = URL(string:docURL)?.appendingPathComponent("MyFolder")
let fileName = "\(resourceFile).\(resourceExtension)"
guard let newDestPath = destFolderPath, let sourcePath = Bundle.main.path(forResource: resourceFile, ofType: ".\(resourceExtension)"), let fullDestPath = NSURL(fileURLWithPath: newDestPath.absoluteString).appendingPathComponent(fileName) else {
    return stringURLPath
}

包含很多错误

  • URL(string文件路径的 API 是错误的,它是URL(fileURLWithPath).
  • 第二个参数为path(forResource:ofType:)不得有前导点。
  • The API absoluteString作为参数是错误的URL(fileURLWithPath
  • 不是真正的错误,但不要使用NSURL在斯威夫特.

强烈建议始终使用URL相关 API 用于连接路径并从中获取文档文件夹FileManager。此外,制作该方法是一个很好的做法throw真正的错误而不是返回无意义的文字字符串。和NSSearchPathForDirectoriesInDomains已过时,不应在 Swift 中使用。

func copyFileFromBundleToDocumentDirectory(resourceFile: String, resourceExtension: String) throws -> URL
{
    let sourceURL = Bundle.main.url(forResource: resourceFile, withExtension: resourceExtension)!
    
    let fileManager = FileManager.default
    let destFolderURL = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("MyFolder")
    let fullDestURL = destFolderURL.appendingPathComponent(resourceFile).appendingPathExtension(resourceExtension)
    
    if !fileManager.fileExists(atPath: destFolderURL.path) {
        try fileManager.createDirectory(at: destFolderURL, withIntermediateDirectories: true, attributes: nil)
        print("Created folder successfully in :::", destFolderURL.path)
        try fileManager.copyItem(at: sourceURL, to: fullDestURL)
        print("Saved file successfully in :::", fullDestURL.path)
    } else {
        print("Folder already exists!")
        if fileManager.fileExists(atPath: fullDestURL.path) {
            print("File exists in ::: \(fullDestURL.path)")
        } else {
            try fileManager.copyItem(at: sourceURL, to: fullDestURL)
            print("Saved file successfully in :::", fullDestURL.path)
        }
    }
    return fullDestURL
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每次启动/重新运行应用程序时,iOS 文件路径都会发生变化 的相关文章

随机推荐

  • Thread.Abort 和替代方案

    这更多是出于个人好奇 兴趣 而不是我试图解决的特定问题 假设您有一个程序正在对用户提供的信息 例如搜索字符串 执行某些操作 这些信息会随着用户键入而更改 假设您想要向用户显示与他们在任何给定时间键入的内容最相关的信息 如果线程确实可以中止
  • PHP 中内爆二维数组

    我有一个像这样的数组 Array 0 gt Array 0 gt a 1 gt b 1 gt Array 0 gt c 2 gt Array 0 gt d 1 gt e 2 gt f 我想将数组转换为如下所示的字符串 arrtostr a
  • Spring Boot 项目设置设计决策

    我们将使用 Spring Boot 来创建服务 我们最初的想法是每个服务 不一定是微服务 都是独立的 并部署为 jar 文件 用于构建的 Maven 我想知道什么是一个好的 Spring Boot 项目结构 因为每个服务都是独立的 但我猜测
  • MS Exchange 服务器的 Grails 邮件插件配置

    我可以使用我的 gmail 帐户从我的 grails 应用程序发送电子邮件 但是当我使用 MS Exchange 服务器帐户时 我收到此错误 Message Mail server connection failed nested exce
  • 如果再次调用函数,则取消超时/计时器 --- debounce 函数

    我想创建一个启动超时的函数 但如果在计时器结束之前再次调用该函数 请取消原始调用并再次启动计时器 我想我可以这样做 function setTimer setTimeout gt do something 3000 但这不起作用 每次我运行
  • Ruby Regex 用于捕获两个字符串之间的所有内容(包括)

    我正在尝试清理一些 HTML 并仅删除一个标签 我真的很想避免使用 nokogiri 等 所以我出现了以下字符串 我想删除它 div class lt div gt m这有效 但它也会匹配并包括任何进一步的 div 文档中的标签 这是我不想
  • PySpark:如何转置数据框中的多列

    我是 Spark 新手 需要帮助将以下输入数据帧转换为所需的输出df 行到列 使用 PySpark 或 Spark Sql 输入数据框 A B C D 1 2 3 4 10 11 12 13 所需的输出 转置 数据 A 1 B 2 C 3
  • 为什么我看到的线程数比我在“ps”列表中创建的线程数多了一个?

    当我创建一个线程时 pthread create 从我的主进程中 我看到三 3 个线程ps上市了 这是为什么呢 也就是说 我看到主线程的进程 一个用于创建的线程 第三个用于其他线程 还有什么东西 一切工作正常 我只是想知道额外列出的过程是什
  • 使用 std::ios::sync_with_stdio(false) 可以比 scanf 和 printf 更快吗?

    我只知道使用 cin 和 cout 会比 scanf 和 printf 慢 然而 最佳答案说使用 std ios sync with stdio false 可以比 scanf printf 更快 然而我做了这个实验 发现不对 是我的错吗
  • 在最后一个窗口上调用 dispose 后,java swing 程序未关闭

    前言 这是我做的第一个真正的挥杆项目 我有一个 swing 程序 其中一个 JButton 应该退出该程序 该按钮会触发 this dispose 当我点击这个 JButton 时 它does使窗口完全消失 但查看调试器 程序本身仍在运行
  • 从 git status bash 输出创建字符串数组

    我正在尝试创建修改后的 git 文件的字符串数组 以便我可以在 bash 程序中使用它们 示例输出 On branch restructured Your branch is up to date with origin restructu
  • 如何使用 React Navigation v5 保留带有嵌套导航的初始路线?

    首先让我声明我知道如何使用反应导航从一个嵌套页面导航到另一个嵌套页面 但是 每当我导航到不是初始路线的嵌套屏幕时 每当我导航回该嵌套堆栈时 该屏幕就会成为第一个屏幕 Example Parent Navigator Nested Stack
  • 在 NSSplitView 中隐藏分隔线

    Since NSSplitView不允许隐藏其分隔线 委托方法仅允许隐藏位于分割视图边缘的分隔线 我选择子类化NSSplitView并重写其绘制方法以防止绘制特定的分隔线 但是 一旦我覆盖其中任何一个draw rect or drawDiv
  • Socket.io 脚本大小减小

    socket io 源脚本大约 70k 很大一部分是注释 空格 我需要将该脚本缩小到较小的大小 有些脚本甚至没有空格 代码都在一起 这减少了脚本的原始大小 socket io 脚本的位置在哪里 以便我可以删除注释和空格 或者是否有一个没有注
  • 将表达式参数作为参数传递给另一个表达式

    我有一个过滤结果的查询 public IEnumerable
  • 使用 CSS 在页面加载时实现淡入效果

    CSS 过渡可用于允许文本段落在页面加载时淡入吗 我真的很喜欢它的样子http dotmailapp com 并希望使用 CSS 来实现类似的效果 该域名已被购买 不再具有上述效果 可以查看存档副本在时光机上 插图 有这个标记 div p
  • 将 lambda 作为泛型类型的参数传递 - java 8

    如果我有一个方法foo Predicate bar 我接下来可以使用它 foo new Predicate
  • 为什么设置“export OPENBLAS_NUM_THREADS=1”会影响性能?

    我尝试将 export OPENBLAS NUM THREADS 1 设置为这个文件建议 但我发现一个奇怪的现象 设置这个会严重损害我的 RL 算法的性能 我对 TD3 和 SAC 做了一些测试 所有结果一致表明 导出 OPENBLAS N
  • 在 WooCommerce 电子邮件通知上显示第二个自定义字段

    我已将两个自定义字段添加到我的 WooCommerce 结帐页面 我设法让它们出现在前端和后端 下一步是获取要在订单电子邮件中显示的字段 我发现这段电话号码代码非常适合电话号码自定义字段 add filter woocommerce ema
  • 每次启动/重新运行应用程序时,iOS 文件路径都会发生变化

    我在每次启动应用程序时更改文件路径时遇到问题 我在应用程序包中有一个文件 AppConstant json 我需要将该文件复制到应用程序文档目录中 我成功地将 AppConstant json 文件保存在文档目录中创建的用户文件夹 MyFo