Bundle.main.path (forResource: ofType: inDirectory :) возвращает ноль

86

Постарайтесь не смеяться и не плакать - я только возвращаюсь к программированию через 20 лет ...

Я провел более 4 часов, просматривая ссылки и пробуя фрагменты кода, чтобы получить Bundle.main.path для открытия моего текстового файла поэтому я могу читать данные для своего приложения (мой следующий шаг - правильно проанализировать их).

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 или использовать пункт меню File -> Add Files to ...

Закариус Джей Поггенпол
источник
let path: String = Bundle.main.path (forResource: "charlie", ofType: "txt")! let url: URL = URL (fileURLWithPath: path)
Химаншу Морадия
Возможный дубликат stackoverflow.com/questions/34548771/…
Лео Дабус
@LeoDabus моя проблема похожа на [ссылка] stackoverflow.com/questions/40822170/… (которую вы также прокомментировали), а также дает мне ту же ошибку.
Zakarius Jay Poggenpohl
Брат твою проблему решить или нет?
Himanshu Moradiya
Нет, та же ошибка. :. (...
Закариус Джей Поггенпол

Ответы:

200

Проблема в том, что файл не копируется в ваш набор приложений. Починить это:

  • Щелкните свой проект
  • Щелкните свою цель
  • Выберите этапы сборки
  • Разверните ресурсы пакета копирования
  • Нажмите «+» и выберите свой файл.
Денис Хеннесси
источник
1
Я добавил файл в «Копировать ресурсы пакета», однако я также нашел его в моем списке «Источники компиляции», потому что изначально это был быстрый файл, пока я не изменил расширение. Но изменение расширения не привело к его удалению из «Исходников компиляции». Я вытащил его, запустил и работал как шарм.
Кристофер Уэйд Кэнтли
9
Это сработало для меня, когда ничего не помогло. Почему файл, который я загружаю в Xcode, не отображается автоматически в разделе «Копировать ресурсы пакета» ???
Trev14 07
@ Trev14 не имеет смысла, что это не происходит автоматически
andrewcar
1
Безумие, потерял пару часов на это, когда забыл эту "уловку" с проверкой того, что добавляется в пакет приложений. Проблема заключалась в том, что я использовал другую среду IDE, в которую я добавил файл, и эта среда не редактировала .pbxproj, поэтому у меня не было моего ресурса в пакете приложений
jpcarreira
34

Дважды проверьте Optionsв add filesменю при добавлении файла. Add to targetsЧтобы добавить цель в пакет, необходимо отметить галочку:

Если вы действительно находитесь в другом пакете (например, тест), используйте:

guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
        fatalError("File not found")
}
мелкая мысль
источник
26

Щелкните файл на панели навигации и откройте правую панель / инспектор свойств.

введите описание изображения здесь

Убедитесь, что вы добавили к целевому членству

Кельвин Фок
источник
1
Для всех, кто это видит, и это решение для вас, как и для меня, вы должны делать это каждый раз, когда файл заменяется новой версией.
Мика Монтойя
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.
Химаншу Морадия
источник
@LeoDabus, подожди, я только что преобразовал этот код в
Swift
1
Я очень ценю вашу попытку помочь, но я получаю следующую ошибку: фатальная ошибка: неожиданно обнаружен nil при разворачивании необязательного значения
Закариус Джей Поггенпохл
какая линия? @ZakariusJayPoggenpohl
Himanshu Moradiya
4

Ах, так что я столкнулся с той же проблемой, что и OP.

Проблема в том, что решения, представленные здесь и здесь , не работают, когда код выполняется на игровой площадке, поскольку Optionsменю add filesвыглядит иначе, поскольку в нем не отображается Add to targetsполе:

введите описание изображения здесь

Находясь внутри .playgroundфайла, вместо этого нажмите Hide or show the Navigatorкнопку в правом верхнем углу окна Xcode (визуальное впечатление) ->введите описание изображения здесь

Затем, когда навигатор откроется в левой части окна Xcode, просто перетащите файл в Resourcesкаталог игровой площадки.

Если ваша установка выглядит примерно так, все должно быть в порядке:

введите описание изображения здесь

Montmons
источник
Спасибо. Это помогло мне, так как я тестировал некоторый код на игровой площадке (часть большого проекта).
mayankk2308 06
3

Это было полезно для меня: xcode - скопируйте структуру папок в мой комплект приложений

Отметьте опцию «создавать ссылки на папки» при создании ресурсов во вложенных папках.

Затем найдите путь к файлу следующим образом:

let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)
Аркадиуш Турлевич
источник
3

Безумно, сколько времени может стоить такая простая задача.

Некоторые ответы здесь помогли мне, но я всегда пробовал:

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

По какой-то причине это не работает, но получение пути и его последующий перевод в URL-адрес работают:

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)
случайный контроль
источник
2

Та же проблема, немного другая ситуация и решение. Я следую руководству, в котором говорится, что нужно использовать следующий код:

    // 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)

Казалось бы, руководство было ошибочным, когда мне было сказано включить звук в путь.

мирный тип
источник
2

Я добавил file.txtв свой проект, и он был автоматически добавлен в Copy Bundle Filesмой проект. Мне пришлось удалить расширение из файла, forResourceи это сработало.

let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"
Райан Р
источник
0

Я думаю, тебе не нужен inDirectory:метод. Попробуйте вместо этого:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
Роб Мэйофф
источник