J'essaie d'écrire un simple IO wrapper pour Swift.
Pour tester cela, j'ai un fichier nommé "Test.txt" à la racine de mon projet.
J'ai ajouté ce fichier à Build Phases dans Build Bundle Resources, comme suggéré par tous les autres utilisateurs du même problème.
J'ai implémenté une classe File très simple avec une fonction de lecture dans le but de générer le contenu du fichier.
class File2{
let resourceName: String
let type: String
let bundle = NSBundle.mainBundle()
init(resourceName: String, type: String = "txt"){
self.resourceName = resourceName
self.type = type
println(self.bundle)
}
func read(){
let path = self.bundle.pathForResource("Test.txt", ofType: "txt") //Hard coded these in just to make sure Strings contained no whitespace
println(path) //This returns nil...why?
var error:NSError?
//print(String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!)
//return String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!
}
}
Lorsque j'imprime le contenu de l'ensemble, j'obtiens un URI à un emplacement spécifique de mon système de fichiers, qui est, je suppose, l'emplacement virtuel de l'application dans le simulateur. En y accédant, il se trouve qu’il contient bien mon fichier "Test.txt".
Maintenant, tout ce que je veux faire, c'est obtenir le chemin d'accès à ce fichier.
Je le fais en appelant: self.bundle.pathForResource("Test.txt", ofType: "txt")
Ceci retourne "nil"
Pourquoi? :)
N'incluez pas le .txt
dans le paramètre name, transmettez-le en tant que paramètre extension.
De la documentation :
extension
L'extension du nom de fichier du fichier à localiser.
Si vous spécifiez une chaîne vide ou nil, l'extension est supposée ne pas exister et le fichier est le premier fichier rencontré qui correspond exactement à nom.
let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")
let bundle = NSBundle.mainBundle()
let path = self.bundle.pathForResource("Test", ofType: "txt")
NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];
Dans Swift 3.0, écrivez avec
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
Remplacez votre
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
avec
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
Remplacer
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
avec
let path = self.bundle.pathForResource("Test", ofType: "txt")
Pour ceux d'entre vous qui tentent d'accéder aux ressources dans les tests unitaires, j'ai rencontré un problème: la ressource était introuvable dans le bundle principal et ma solution consistait à rechercher le chemin dans tous les bundles. un identifiant de paquet, où fileName
est une chaîne passée dans la fonction et bien sûr, le type peut être celui que vous souhaitiez.
NSString *path;
for (NSBundle *bundle in [NSBundle allBundles]) {
path = [bundle pathForResource:fileName ofType:@"json"];
if (path) {
break;
}
}
Une autre raison de NSBundle.mainBundle (). PathForResource renvoie nil est que le fichier n’a pas été ajouté correctement à la cible. Lorsque vous faites glisser le fichier en liasse, assurez-vous que les cases à cocher "Ajouter à la cible" et "Copier les éléments si nécessaire" sont cochées.
Le paramètre ofType ajouté au nom de la ressource, remplacez donc cette ligne:
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
à quelque chose comme ça:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Le Build Bundle Resources est également nécessaire de vérifier.