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

时间:2015-12-31 16:01:58

标签: ios swift

我在文件夹中有一组音频文件。我可以在文件放在主捆绑包时访问该文件,但如果文件在文件夹中移动,我将无法访问这些文件。

代码:

<?php

if (isset($_POST["submit"])) {
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'Demo Form'; 
    $to = 'example@gmail.com'; 

    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if (!$_POST['name']) {
        $errName = 'Please enter your name';
    }

    if (!$_POST['email'] || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        $errEmail = 'Please enter a valid email address';
    }

    if (!$_POST['message']) {
        $errMessage = 'Please enter your message';
    }

    if (!$errName && !$errEmail && !$errMessage) {
        if (mail ($to, $subject, $body, $from)) {
            $result='<div class="alert alert-success">Thank You</div>';
        } else {
            $result='<div class="alert alert-danger">Please try again later</div>';
        }
    }
}
?>

我在audioFiles文件夹中有一个音频文件,我希望得到它的路径。

错误:

  

致命错误:在解包可选值时意外发现nil

2 个答案:

答案 0 :(得分:42)

首先确保将文件夹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:,子目录:)

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

答案 1 :(得分:1)

Leo的答案应该起作用,关键步骤是选中“如果需要,复制项目”。但是,如果您已经创建文件或忘记了这一关键步骤,该怎么办?

易于修复。

转到Project-> Build Phases-> Copy Bundle Resources

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资源)列表,则该文件不存在。 taDa!