Copie de fichier du bundle à la sandbox sur Mac
muqaddar
Administrateur
Salut,
Petit soucis de copie de fichier.
Fichier d'origine dans le bundle : 396 Ko
Fichier copié: 8 Ko
Affichage de l'erreur:
Error Domain=NSCocoaErrorDomain Code=260 "The file “dbread†couldn't be opened because there is no such file." UserInfo=0x10055e4f0 {NSFilePath=/Users/muqaddar/Library/Developer/Xcode/DerivedData/MyApp_Mac-clabxnjtdtwqksdnixvadiyzbtri/Build/Products/Debug/MyApp Mac.app/dbread, NSUnderlyingError=0x10055e460 "The operation couldn't be completed. No such file or directory"}
Il ne le trouve pas dans le bundle. Or je suis allé vérifier le fichier dans le bundle, il est bien présent et fait bien 396 Ko.
J'ai apparemment un problème sur ce chemin.
Une idée ?
EDIT: Pour info:
Petit soucis de copie de fichier.
<br />
[color=#3D1D81][font=Monaco][size=2][color=#bb2ca2]if[/color][color=#000000] (![[[/color][color=#703daa]NSFileManager[/color][color=#000000] [/color]defaultManager[color=#000000]] [/color]fileExistsAtPath[color=#000000]:[/color][color=#78492a]DATABASE_READ_SANDBOX_PATH[/color][color=#000000]]) [/color][/size][/font][/color]<br />
[font=Monaco][size=2]{ [/size][/font]<br />
[color=#78492A][font=Monaco][size=2][color=#000000][[[/color][color=#703daa]NSFileManager[/color][color=#000000] [/color][color=#3d1d81]defaultManager[/color][color=#000000]] [/color][color=#3d1d81]copyItemAtPath[/color][color=#000000]:[/color]DATABASE_READ_BUNDLE_PATH[color=#000000] [/color][color=#3d1d81]toPath[/color][color=#000000]:[/color]DATABASE_READ_SANDBOX_PATH[color=#000000] [/color][color=#3d1d81]error[/color][color=#000000]:&error];[/color][/size][/font][/color]<br />
[font=Monaco][size=2]} [/size][/font]<br />
Fichier d'origine dans le bundle : 396 Ko
Fichier copié: 8 Ko
Affichage de l'erreur:
Error Domain=NSCocoaErrorDomain Code=260 "The file “dbread†couldn't be opened because there is no such file." UserInfo=0x10055e4f0 {NSFilePath=/Users/muqaddar/Library/Developer/Xcode/DerivedData/MyApp_Mac-clabxnjtdtwqksdnixvadiyzbtri/Build/Products/Debug/MyApp Mac.app/dbread, NSUnderlyingError=0x10055e460 "The operation couldn't be completed. No such file or directory"}
Il ne le trouve pas dans le bundle. Or je suis allé vérifier le fichier dans le bundle, il est bien présent et fait bien 396 Ko.
[color=#3d1d81]NSLog[/color][color=#000000]([/color][color=#d12f1b]@"%@"[/color][color=#000000], [/color]DATABASE_READ_BUNDLE_PATH[color=#000000]);[/color]
/Users/muqaddar/Library/Developer/Xcode/DerivedData/MyApp_Mac-clabxnjtdtwqksdnixvadiyzbtri/Build/Products/Debug/MyApp Mac.app/dbread
J'ai apparemment un problème sur ce chemin.
Une idée ?
EDIT: Pour info:
<br />
#define BUNDLE_PATH [[NSBundle mainBundle] bundlePath]<br />
#define DATABASE_READ_FILE @"dbread"<br />
#define DATABASE_READ_BUNDLE_PATH [BUNDLE_PATH stringByAppendingPathComponent:DATABASE_READ_FILE]<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
À mon avis dbread est dans les répertoire /resources.
C'est ce que je me suis dit.
Et je suis donc aller vérifier que bundlePath existait bien sur Mac, ce qui est le cas.
Edit: il faut utiliser resourcePath. (petite différence avec iOS)
Et au pire, resourcePath retourne normalement également toujours le bon chemin (soit la racine du Bundle sur iOS, et le sous-dossier "Ressources" du bundle sous OSX) donc pas besoin de faire de condition avec #if ou quoi pour l'utiliser.
Je vais tester également.
Bah tu récupérais comment le chemin vers tes ressources avant quand tu avais besoin de pointer dessus ?
C'est quand même la méthode de base pour faire ça, mentionnée partout dans la doc et sur les forums & co, pour récupérer le chemin d'accès vers une ressource de ton appli, c'est pas le premier truc qu'on apprend quand on fait du dev Cocoa mais presque, non ?
NSString *path = [/color][color=#703daa]NSBundle[/color][color=#000000] [/color]mainBundle[color=#000000 pathForResource:@github-rates ofType:@json];
Je n'ai pas eu besoin de récupérer d'autres ressources.
Sinon, comme je l'ai, j'ai utilisé bundlePath pour avoir la racine du bundle sous iOS. Mon erreur semble que j'aurais dû utiliser resourcePath même sur iOS.
Et c'est important de passer par là car il y a potentiellement plein de subtilités auxquelles on ne pense pas quand on essaye de manipuler les chemins à l'intérieur du Bundle nous-même (entre autres, la gestion de la localisation et des lproj, avec le fallback sur la Base Localisation et tout).
En gros, sous iOS, les seules méthodes de NSBundle que j'utilise sont :
Sous OSX, on peut potentiellement avoir besoin de quelques autres méthodes si on travaille avec des Plugins par exemple, genre +bundleForClass, peut-être. Mais dans tous les cas, je n'ai jamais eu à récupérer le chemin d'un sous-dossier du bundle pour ensuite construire moi-même le path à la main avec stringByAddingPathComponent plus tard, je demande toujours directement au bundle de me calculer et retourner le bon path pour ce dont j'ai besoin comme ça il traite toutes les subtilités, variations entres iOS et OSX, L10n, et autres joyeusetés.
Je vais m'imposer cette façon de faire.