Swift - 如何获取文件夹内的文件路径

27

我有一组音频文件放在一个文件夹内。如果这些文件放在main bundle里,我可以访问它们,但是如果这些文件被移动到文件夹内,我就无法访问它们。

代码:

let audioFileName:String = "audioFiles/" + String(index)
let audioFile = NSBundle.mainBundle().pathForResource(audioFileName, ofType: "mp3")!

我有一个音频文件在audioFiles文件夹里面,我想获取它的路径。

错误:

致命错误:在展开可选值时意外地发现了nil


问题在哪里?请添加更多信息。 - Luca D'Alberti
你确定音频文件安装在应用程序包的子目录中吗? - Martin R
是的,音频文件在应用程序包的子目录中。 - Rahul Krishna
2个回答

63

首先,在将文件夹"audioFiles"拖到项目中时,请确保选中"如果需要则复制项目项"并选择"创建文件夹引用"。此外,请确保在项目中显示为蓝色文件夹。

enter image description here

enter image description here

另外,NSBundle方法pathForResource有一个初始化程序,您可以指定文件所在的目录:

let audioFileName = "audioName" 

if let audioFilePath = Bundle.main.path(forResource: audioFileName, ofType: "mp3", inDirectory: "audioFiles") {
    print(audioFilePath)
}

如果你想获取那个文件的URL,你可以使用NSBundle方法URLForResource(withExtension:, subdirectory:)

if let audioFileURL = Bundle.main.url(forResource: audioFileName, withExtension: "mp3", subdirectory: "audioFiles") {
    print(audioFileURL)
}

1
你的文件夹是黄色的,应该是一个蓝色的文件夹,位于与你的Swift文件相同的文件夹中。 - Leo Dabus
2
如果你不按照我说的方式复制文件,那么什么都无济于事。请在AppDelegate.swift下方找到蓝色文件夹。 - Leo Dabus
1
谢谢。它起作用了。最初我在Xcode中创建了文件夹,然后按照您的说明添加了文件。现在我清除了所有内容,并按照您的说明添加了完整的文件夹,它起作用了。非常感谢! - Rahul Krishna
1
示例Swift 3代码:如果let indexFilePath = Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "homeless-help-web") { print(indexFilePath) } - Keith John Hutchison
2
无法运行,我不知道为什么。文件名和文件夹名称都正确,但程序看不到它。 - surfrider
显示剩余10条评论

2
Leo的回答应该是可行的,关键步骤是检查“如果需要则复制项目”。但是,如果您已经创建了文件或忘记了这个关键步骤,该怎么办呢?
很容易解决。
转到“项目”->“构建阶段”->“复制捆绑资源”。

enter image description here

在这里,您将看到一个方便的列表,其中包含您添加到捆绑包中的所有文件(包括所有xcassets!)

点击添加按钮,找到您缺失的未链接文件。

现在您的代码将正常工作(我构建了自己的示例,因此名称可能与您的不同):

        if let url = Bundle.main.url(forResource: "testData2", withExtension: "txt") {
            do {

                let myData = try Data(contentsOf: url)
                print(myData.count)
            } catch {
                print(error)
            }
        }

那么为什么一开始我们找不到文件呢?很简单。我们在问bundle,“嘿,我的文件在哪里”。bundle回答说...我不知道那个文件,如果你检查了它的列表(被复制的Bundle资源),你会发现它不在那里。taDa!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接