Bundle.main.path(forResource:ofType:inDirectory :)返回nil

时间:2017-01-21 03:53:48

标签: ios swift macos file swift3

尽量不要笑或哭 - 我只是在20年后重新开始编码...

我花了4个多小时查看引用并尝试使用代码片段来获取Bundle.main.path以打开我的文本文件,以便我可以读取我的应用程序的数据(我的下一步是适当地解析它)。 / p>

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt")
{
    do
    {
        let contents = try String(contentsOfFile: filepath)
        print(contents)

    }
    catch
    {
        print("Contents could not be loaded.")
    }
}
else
{
    print("newTest.txt not found.")
}

结果是:"找不到newTest.txt。"无论我如何将文件拖放到项目中,在Xcode中创建文件或使用文件 - >将文件添加到...菜单项。

12 个答案:

答案 0 :(得分:126)

问题是该文件没有处理您的应用包。解决它:

  • 点击您的项目
  • 点击目标
  • 选择构建阶段
  • 展开复制捆绑资源
  • 点击“+”并选择您的文件。

答案 1 :(得分:23)

添加文件时,请仔细检查Options菜单中的add files。必须勾选Add to targets中的目标才能将其添加到捆绑包中:

NequeoFFmpeg

如果您实际上在另一个包中(例如测试),请使用:

guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
        fatalError("File not found")
}

答案 2 :(得分:11)

在导航面板上单击文件,然后打开“右面板/属性检查器”。

enter image description here

Ensure that you add to target membership

答案 3 :(得分:5)

Swift 3.0

let fileNmae = "demo"

let path = Bundle.main.path(forResource: fileNmae, ofType: "txt")
    do {
        let content = try String(contentsOfFile:path!, encoding: String.Encoding.utf8)
        print(content)
    } catch {
        print("nil")
    }

SWift 2.0

do{
      if let path = NSBundle.mainBundle().pathForResource("YOURTXTFILENAME", ofType: "txt"){
             let data = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding)
             let myStrings = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
              print(myStrings)
       }
  } catch let err as NSError {
            //do sth with Error
            print(err)
  }

输出

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.

答案 4 :(得分:3)

如此简单的问题要花多少时间,这很疯狂。

这里的一些答案对我有所帮助,但我一直尝试:

Bundle.main.url(forResource: selectedTitle, withExtension: "mp3")

出于某种原因,该方法不起作用,但随后获取路径并将其转换为URL即可:

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)

答案 5 :(得分:2)

啊,所以我发现自己处理与OP完全相同的问题。

问题是,当在操场上执行代码时,herehere给出的解决方案不起作用,因为Options的{​​{1}}菜单看起来不同因为它没有显示add files字段:

enter image description here

当在Add to targets文件中时,请按Xcode窗口右上角的.playground按钮(视觉展示) - > enter image description here

然后,一旦导航器在Xcode窗口的左侧折叠打开,只需拖动&将文件拖放到游乐场的Hide or show the Navigator目录中。

如果您的设置看起来如下所示,那么您应该没问题:

enter image description here

答案 6 :(得分:2)

我将file.txt添加到我的项目中,它会自动添加到我项目的Copy Bundle Files中。对我来说,我必须从forResource删除扩展程序并且它有效。

let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"

答案 7 :(得分:1)

同样的问题,略有不同的情况&解。我正在遵循一个说使用以下代码的教程:

    // Start the background music:
    if let musicPath = Bundle.main.path(forResource:
        "Sound/BackgroundMusic.m4a", ofType: nil) {
        print("SHOULD HEAR MUSIC NOW")
        let url = URL(fileURLWithPath: musicPath)

        do {
            musicPlayer = try AVAudioPlayer(contentsOf: url)
            musicPlayer.numberOfLoops = -1
            musicPlayer.prepareToPlay()
            musicPlayer.play()
        }
        catch { print("Couldn't load music file") }
    }
}

我和其他人有同样的问题,但没有一个解决方案解决了这个问题。经过实验,我所做的只是从以下调用中的路径中删除声音,一切正常:

Bundle.main.path(forResource: "BackgroundMusic.m4a", ofType: nil)

通过告诉我在路径中包含声音,似乎该教程出错了。

答案 8 :(得分:0)

我认为你不想要inDirectory:方法。试试这个:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {

答案 9 :(得分:0)

这对我很有帮助:xcode - copy a folder structure into my app bundle

在嵌套文件夹中创建资产时,标记“创建文件夹引用”选项。

然后找到文件的路径,如下所示:

let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)

答案 10 :(得分:0)

我的问题出在一个用 Cocoapods 创建的模块中。每个 pod 安装/更新,文件(json 文件)都在项目中,但从未在 Bundle 中找到。在 pod install/update 之后,我删除了(删除了引用)文件并再次添加到项目中。

始终注意添加文件的目标。

答案 11 :(得分:0)

答案很简单,不要使用 Assets.xcassets 来存储您的音频文件, 并将您的音频文件,即)BeTheFirstAudio.m4a(用 QuickTime 制作),直接添加到项目导航器(圆圈,粉红色)文件列表(照片 1)

enter image description here

警告!在从 Finder 窗口拖动音频文件后出现弹出窗口时,请务必选中“创建组”和“添加到目标”复选框。

enter image description here

之后,您的代码应该可以播放音频(包括来自 QuickTime 的 .m4a 扩展名)

 import AVFoundation

 class AudioPlayer: NSObject {


     private var audioPlayer: AVAudioPlayer!

     override init() {
         super.init()
    
         // get URL for the default audio
         let audioURL = Bundle.main.url(forResource: "BeTheFirstAudio", withExtension: "m4a")

         audioPlayer = try! AVAudioPlayer(contentsOf: audioURL!)
     }

苹果工程师应该感到羞耻的是,这个问题甚至是 StackOverflow 中的一个问题;开发人员应该能够将音频文件添加到 Assets.xcassets 并且 Bundle.main.url 应该能够找到它。这个简单的概念很困难,这一事实可能让开发人员花费了大量时间。注意@苹果