每次启动/重新运行应用程序时,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 文件路径都会发生变化 的相关文章

  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 无法连接到 iTunes Store(获取应用内购买列表)

    我正在尝试从我的应用程序的应用程序内购买项目商店中获取列表 这是我所做的 安装了新的配置文件并启用了应用内购买 替换配置文件很棘手 但我认为我的设置是正确的 验证税务和银行信息是否正常 该应用程序已在商店出售 创建测试用户 在测试设备上以测
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • 如何在button.addTarget操作中发送多个按钮?斯威夫特3

    如何将button和button2发送到我的pressButton2函数中 当用户触摸按钮2时 我需要更改按钮和按钮2的颜色 当我的 button2 addTarget 看起来像这样时 我收到错误 表达式列表中存在预期表达式 import
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 使用 MapKit 的地形和卫星视图

    我是 Mapkit View 的新手 当我给出没有目的地的纬度和经度时 我想显示 MapKit中是否可以通过地形 卫星视图来显示地图 有教程链接吗 我看过一些访问 Google 地图 API html 文件 的示例 有必要吗 或者您可以通过
  • 当直接从 usdz 文件而不是 Reality Composer 文件加载模型时,如何在 RealityKit 中渲染阴影?

    将模型直接从 usdz 文件添加到场景锚点时 模型下方不会出现接地阴影 如果您将模型导入 RealityComposer 并添加 RealityComposer 场景 则会出现这些 但是 您可以在不使用 RC 的情况下启用接地阴影吗 我尝试
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • iPhone 上的纵向 UISplitViewController 在 iOS 8 中始终显示主视图和细节视图

    UISplitViewController in portrait在 iPhone 上始终显示主控和细节iOS 8 我尝试子类化UISplitViewController并将其配置为同时显示主视图和细节视图 但没有任何效果 class AP
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do

随机推荐

  • 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