Bundle.main.path (forResource: ofType: inDirectory :) zwraca nil

86

Staraj się nie śmiać ani nie płakać - wracam do kodowania po 20 latach ...

Spędziłem ponad 4 godziny na przeglądaniu referencji i wypróbowywaniu fragmentów kodu, aby uzyskać Bundle.main.path do otwarcia mojego pliku tekstowego więc mogę wczytać dane dla mojej aplikacji (następnym krokiem jest ich odpowiednie przeanalizowanie).

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.")
}

Wynik jest następujący: „Nie znaleziono newTest.txt”. niezależnie od tego, jak próbuję przeciągnąć i upuścić plik do projektu, utworzyć plik w Xcode lub użyć pozycji menu Plik -> Dodaj pliki do ...

Zakarius Jay Poggenpohl
źródło
let path: String = Bundle.main.path (forResource: "charlie", ofType: "txt")! let url: URL = URL (fileURLWithPath: path)
Himanshu Moradiya
Możliwy duplikat stackoverflow.com/questions/34548771/ ...
Leo Dabus
@LeoDabus mój problem jest podobny do [link] stackoverflow.com/questions/40822170/… (który również skomentowałeś) i również daje mi ten sam błąd.
Zakarius Jay Poggenpohl
Bracie, twój problem rozwiązał czy nie?
Himanshu Moradiya
Nie, ten sam błąd. :. (...
Zakarius Jay Poggenpohl

Odpowiedzi:

200

Problem polega na tym, że plik nie jest kopiowany do pakietu aplikacji. Naprawić to:

  • Kliknij swój projekt
  • Kliknij swój cel
  • Wybierz fazy budowy
  • Rozwiń Kopiuj zasoby pakietu
  • Kliknij „+” i wybierz plik.
Denis Hennessy
źródło
1
Dodałem plik do „Kopiuj zasoby paczki”, ale znalazłem go również na mojej liście „Kompiluj źródła”, ponieważ pierwotnie był to plik szybki, dopóki nie zmieniłem rozszerzenia. Ale zmiana rozszerzenia nie usunęła go z „Compile Sources”. Więc wyciągnąłem go, uruchomiłem i działałem jak urok.
Christopher Wade Cantley
9
To działało dla mnie, gdy nic innego nie działało. Dlaczego plik, który wrzucam do Xcode, nie pojawia się automatycznie w sekcji „Kopiuj zasoby pakietu” ???
Trev14,
@ Trev14 nie ma sensu, że nie dzieje się to automatycznie
andrewcar
1
Szaleństwo, straciłem na tym kilka godzin, kiedy zapomniałem o tej „sztuczce” sprawdzania, co jest dodawane do pakietu aplikacji. Problem polegał na tym, że korzystałem z innego IDE, w którym dodałem plik i to IDE nie edytowało pliku .pbxproj, więc nie miałem swojego zasobu w pakiecie aplikacji
jpcarreira
34

Sprawdź dwukrotnie Optionsw add filesmenu podczas dodawania pliku. Cel w Add to targetsmusi być zaznaczony, aby dodać go do pakietu:

Jeśli faktycznie znajdujesz się w innym pakiecie (na przykład przetestuj), użyj:

guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
        fatalError("File not found")
}
płytka myśl
źródło
26

Kliknij plik w panelu nawigacyjnym i otwórz Prawy panel / Inspektor właściwości.

wprowadź opis obrazu tutaj

Upewnij się, że dodajesz do członkostwa docelowego

Kelvin Fok
źródło
1
Dla każdego, kto to widzi i jest to rozwiązanie dla Ciebie, tak jak dla mnie, musisz to zrobić za każdym razem, gdy plik zostanie zastąpiony nową wersją.
Micah Montoya
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)
  }

Wynik :

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.
Himanshu Moradiya
źródło
@LeoDabus czekaj, po prostu przekonwertuję ten kod na Swift 3.0
Himanshu Moradiya
1
Naprawdę doceniam twoją próbę pomocy, ale
pojawia
która linia ? @ZakariusJayPoggenpohl
Himanshu Moradiya
4

Ach, więc właśnie znalazłem się do czynienia z dokładnie tym samym problemem co OP.

Problem w tym, że rozwiązania podane tutaj i tutaj nie działają, gdy kod jest wykonywany na placu zabaw, ponieważ Optionsmenu add fileswygląda inaczej, bo nie pokazuje Add to targetspola:

wprowadź opis obrazu tutaj

Wewnątrz .playgroundpliku zamiast tego naciśnij Hide or show the Navigatorprzycisk w prawym górnym rogu okna Xcode (wrażenie wizualne) ->wprowadź opis obrazu tutaj

Następnie, gdy Nawigator zostanie otwarty po lewej stronie okna Xcode, po prostu przeciągnij i upuść plik do Resourceskatalogu swojego placu zabaw.

Jeśli twoja konfiguracja wygląda mniej więcej tak, powinieneś być w porządku:

wprowadź opis obrazu tutaj

Montmons
źródło
Dziękuję Ci. Pomogło mi to, ponieważ testowałem kod w Playground (część większego projektu).
mayankk2308
3

To było dla mnie pomocne: xcode - skopiuj strukturę folderów do mojego pakietu aplikacji

Zaznacz opcję „utwórz odniesienia do folderów” podczas tworzenia zasobów w zagnieżdżonych folderach.

Następnie znajdź ścieżkę do pliku w ten sposób:

let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)
Arkadiusz Turlewicz
źródło
3

To szalone, ile czasu może kosztować taki prosty problem.

Niektóre odpowiedzi mi pomogły, ale zawsze próbowałem:

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

Z jakiegoś powodu to nie działa, ale uzyskanie ścieżki i późniejsze przetłumaczenie jej na adres URL działa:

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)
randomcontrol
źródło
2

Ten sam problem, nieco inna sytuacja i rozwiązanie. Podążam za samouczkiem, który mówi, że używa następującego kodu:

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

Miałem ten sam problem, co inni, ale żadne z rozwiązań nie rozwiązało problemu. Po eksperymentowaniu wszystko, co zrobiłem, to usunięcie dźwięku ze ścieżki w następującym wywołaniu i wszystko działało:

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

Wydawałoby się, że samouczek był w błędzie, mówiąc mi, żebym dołączył dźwięk do ścieżki.

peacetype
źródło
2

Dodałem file.txtdo mojego projektu i został on automatycznie dodany do Copy Bundle Filesmojego projektu. U mnie musiałem usunąć rozszerzenie z forResourcei zadziałało.

let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"
Ryan R.
źródło
0

Myślę, że nie chcesz tej inDirectory:metody. Spróbuj tego zamiast tego:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
rob mayoff
źródło