Copie de fichier du bundle à  la sandbox sur Mac

muqaddarmuqaddar Administrateur
octobre 2012 modifié dans API AppKit #1
Salut,



Petit soucis de copie de fichier.


<br />
[color=#3D1D81][font=Monaco][size=2][color=#bb2ca2]if[/color][color=#000000] (&#33;[[[/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]:&amp;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]@&quot;%@&quot;[/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			  @&quot;dbread&quot;<br />
#define DATABASE_READ_BUNDLE_PATH	   [BUNDLE_PATH stringByAppendingPathComponent:DATABASE_READ_FILE]<br />

Réponses

  • CéroceCéroce Membre, Modérateur
    Les bundles ne sont pas organisés sur le Mac de la même façon que sur iOS.

    À mon avis dbread est dans les répertoire /resources.
  • MalaMala Membre, Modérateur
    Le truc qui me surprend cache comme ça c'est que tu sois direct dans ton bundle et pas dans les ressources genre "MonAppli.app/Contents/Resources/dbread".
  • muqaddarmuqaddar Administrateur
    octobre 2012 modifié #4
    'Mala' a écrit:


    Le truc qui me surprend cache comme ça c'est que tu sois direct dans ton bundle et pas dans les ressources genre "MonAppli.app/Contents/Resources/dbread".




    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)
  • AliGatorAliGator Membre, Modérateur
    Je comprend pas, tu n'utilises pas pathForResource:ofType: ? Qui justement s'occupe de toutes ces petites subtilités, et retourne le bon chemin dans tous les cas, sur iOS comme sur Mac comme sur simulateur, que la ressource soit localisée ou non, etc, etc ?



    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.
  • muqaddarmuqaddar Administrateur
    Non, je ne l'utilise pas.

    Je vais tester également.
  • AliGatorAliGator Membre, Modérateur
    'muqaddar' a écrit:


    Non, je ne l'utilise pas.
    o_O



    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 ?
  • muqaddarmuqaddar Administrateur
    octobre 2012 modifié #8
    Je ne m'en suis servi qu'une fois apparemment sous iOS:



    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.
  • AliGatorAliGator Membre, Modérateur
    Je n'ai jamais eu à  récupérer bundlePath ou resourcePath (bon sauf une fois pour faire un truc un peu tricky et avancé, en mode "je gruge le RunTime en mode warrior" mais c'est tout). J'ai toujours utilisé les méthodes de NSBundle qui font tout le boulot pour nous pour récupérer le bon chemin pour une ressource donnée.



    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 :
    • +mainBundle
    • -pathForResource:ofType:
    • éventuellement bundleIdentifier (et encore)
    • objectForInfoDictionaryKey:
    • et évidemment, implicitement, localizedStringForKey:value:table: que j'utilise à  travers la macro NSLocalizedString()


    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.
  • muqaddarmuqaddar Administrateur
    Merci pour ces précisions.

    Je vais m'imposer cette façon de faire.
Connectez-vous ou Inscrivez-vous pour répondre.