web-dev-qa-db-fra.com

Bundle.main.path (pourResource: ofType: inDirectory :) renvoie nil

Essayez de ne pas rire ni pleurer - je retourne à la programmation après 20 ans….

J'ai passé plus de 4 heures à rechercher des références et à essayer des extraits de code pour que Bundle.main.path ouvre mon fichier texte afin que je puisse lire les données de mon application (l'étape suivante consiste à l'analyser de manière appropriée).

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

Le résultat est: "newTest.txt introuvable." indépendamment de la façon dont j'essaie de faire glisser le fichier dans le projet, créez le fichier dans Xcode ou utilisez l'élément de menu Fichier -> Ajouter des fichiers à ....

49

Le problème est que le fichier ne s'adapte pas à votre lot d'applications. Réparer:

  • cliquez sur votre projet
  • Cliquez sur votre cible
  • Sélectionnez les phases de construction
  • Développer Copier les ressources du paquet
  • Cliquez sur '+' et sélectionnez votre fichier.
117
Denis Hennessy

Vérifiez deux fois la Options dans le menu add files lorsque vous ajoutez le fichier. La cible dans Add to targets doit être cochée pour l'ajouter à l'ensemble:

 

Si vous êtes réellement dans un autre lot (test par exemple), utilisez:

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

Cliquez sur votre fichier dans votre panneau de navigation et ouvrez l'inspecteur Panneau droit/Propriétés.

 enter image description here

Assurez-vous que vous ajoutez à l'adhésion cible

7
Kelvin Fok

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

Sortie:

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

J'ai ajouté file.txt à mon projet et il a été automatiquement ajouté au Copy Bundle Files de mon projet. Pour moi, j'ai dû supprimer l'extension de la forResource et cela a fonctionné.

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

Ah, alors je viens de me retrouver avec exactement le même problème que le PO. 

Le problème est que les solutions données ici et ici ne fonctionnent pas lorsque le code est exécuté dans un terrain de jeu, car le menu Options de add files est différent car il ne présente pas le champ Add to targets:

 enter image description here

Lorsque vous vous trouvez dans un fichier .playground, appuyez à la place sur le bouton Hide or show the Navigator en haut à droite de la fenêtre Xcode (impression visuelle) -> enter image description here

Ensuite, une fois que le navigateur s’ouvre sur le côté gauche de la fenêtre Xcode, faites simplement glisser votre fichier dans le répertoire Resources de votre terrain de jeu. 

Si votre configuration ressemble à la suivante, tout devrait bien se passer:

 enter image description here

2
Montmons

Même problème, situation et solution légèrement différentes. Je suis un tutoriel qui dit d'utiliser le code suivant:

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

J'avais le même problème que d'autres, mais aucune des solutions ne l'a résolu. Après avoir expérimenté, tout ce que je fis fut de retirer Son du chemin de l'appel suivant et tout fonctionna:

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

Il semblerait que le tutoriel était une erreur en me disant d'inclure Sound dans le chemin.

1
peacetype

Cela m'a été utile: xcode - copier une structure de dossiers dans mon bundle d'applications

Cochez l'option "Créer des références de dossier" lorsque vous créez des actifs dans des dossiers imbriqués.

Puis trouvez le chemin vers le fichier comme ceci:

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

Je pense que vous ne voulez pas la méthode inDirectory:. Essayez ceci à la place:

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