Sauvegarde : création d'un chemin d'accès

odjauodjau Membre
18:38 modifié dans API AppKit #1
Salut tout le monde,
je suis actuellement en train de faire les tutoriaux de Projet:Omega, et je me pose la question suivante :
Lorsque je fait une sauvegarde (par exemple les données d'un NS TableVIEW) en utilisant la méthode writeToFile:atomically: je ne suis pas assuré que l'écriture sera faite si l'argument désignant le chemin d'accès ne correspond pas à  un chemin déjà  existant. Quelle méthode utiliser pour créer le chemin complet s'il n'existe pas ?

Merci d'avance

@+

Réponses

  • Eddy58Eddy58 Membre
    18:38 modifié #2
    BOOL repExist; // Flag d'existence du répertoire

    if (!(NSFileManager defaultManager] fileExistsAtPath:[[[NSString stringWithString:@"~/Documents/"] stringByExpandingTildeInPath] stringByAppendingPathComponent:[NSString stringWithString:@"MySoftDatas" isDirectory:&repExist] && repExist)) // Est-ce que le répertoire "MySoftDatas" existe dans le répertoire "Documents" ?
        {
            NSFileManager defaultManager] createDirectoryAtPath:[[[NSString stringWithString:@"~/Documents/"] stringByExpandingTildeInPath] stringByAppendingPathComponent:[NSString stringWithString:@"MySoftDatas" attributes:nil]; // Non, alors le créer
        }



    J'utilise ce code dans les méthodes init: ou awakeFromNib: pour vérifier l'existence d'un répertoire, et sa création le cas échéant. Ce qui fait qu'il n'y a plus de problèmes pour l'écriture des fichiers ensuite. J'espère que je répond à  ta question ! :)
  • odjauodjau Membre
    18:38 modifié #3
    Va falloir que je décortique précisément pour bien comprendre (genre NSFileManager :-\), mais en gros c'est bien la réponse que j'attendais.

    Merci :)
  • ClicCoolClicCool Membre
    18:38 modifié #4
    En effet, en dehors des panneaux de sauvegarde ou d'ouverture qui garantissent la sécurité du chemin récupéré, le NSFile Manager te donne toutes les clefs pour une gestion des chemins d'accès de bas niveau :)
  • muqaddarmuqaddar Administrateur
    18:38 modifié #5
    Merci Eddy58, ce code m'a bien servi également. ;-)
  • Eddy58Eddy58 Membre
    18:38 modifié #6
    dans 1095614203:

    Merci Eddy58, ce code m'a bien servi également. ;-)


    Tout soft qui se respecte doit normalement incorporer ce chtit bout de code.  8)
  • TiffTiff Membre
    18:38 modifié #7
    J'ai essayé une version simplifiée qui semble fonctionner :
    <br />if (![[NSFileManager defaultManager] fileExistsAtPath:<br />        [@&quot;~/Library/Application Support/DvdThèque&quot; stringByExpandingTildeInPath]])<br /><br />                 [[NSFileManager defaultManager]<br />                            createDirectoryAtPath: [@&quot;~/Library/Application Support/DvdThèque&quot;<br />                                              stringByExpandingTildeInPath] attributes: nil];<br />
    


    Non ? :P
  • Eddy58Eddy58 Membre
    18:38 modifié #8
    Hello Tiff ! :)

    La méthode "fileExistAtPath:" vérifie l'existence d'un fichier et non d'un répertoire. Dans ton code, tu vérifies l'existence du fichier DvdThèque, et s'il n'est pas trouvé, tu crées.......le répertoire DvdThèque. Tu es obligé d'utiliser la méthode "fileExistAtPath:isDirectory:" pour spécifier que tu demandes bien la vérification d'existence d'un répertoire.
  • TiffTiff Membre
    18:38 modifié #9
    Sûr ?
    Dans la doc Apple, ce n'est pas très clair. Même dans la méthode fileExistsAtPath:isDirectory: la doc parle de file au lieu de directory.

    J'ai mis un NSLog pour comprendre le fonctionnement. S'il y a un dossier DvdThèque, fileExistsAtPath: retourne YES, même s'il n'y a pas de fichier DvdThèque. S'il n'y a pas de dossier, ça retourne NO.

    Qu'en penses-tu ?
  • Eddy58Eddy58 Membre
    18:38 modifié #10
    J'en pense que la doc n'est pas très claire du tout ! Si un fileExistsAtPath: vérifie aussi l'existence d'un répertoire, alors ce n'est pas mentionné du tout, mais si tu as fait des essais, c'est que ca fonctionne bien aussi comme ça alors  ???


    - (BOOL)fileExistsAtPath:(NSString *)path
    Returns YES if the file specified in path exists, or NO if it does not. If path specifies a symbolic link, this method traverses the link and returns YES or NO based on the existence of the file at the link destination. If path begins with a tilde, it must first be expanded with stringByExpandingTildeInPath, or this method will return NO.



    Sinon un fileExistsAtPath:isDirectory: marche aussi pour les fichiers si tu donne nil à  isDirectory....mais bon il n'y a aucune utilité....

    Enfin bon c'est curieux cette histoire.... :why?: ;D
  • TiffTiff Membre
    septembre 2004 modifié #11
    fileExistsAtPath:isDirectory:

    - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory
    Returns whether the file specified in path exists. If you want to determine if path is a directory, specify the address of a Boolean variable for isDirectory; the method indirectly returns YES if path is a directory.


    Est-ce que file ne désigne pas à  la fois un fichier et un dossier ? L'option isDirectory permettant de faire la distinction entre les deux ?

    Je reconnais que si un fichier existe, portant le même nom que le dossier recherché, ça va f.. un sacré b..

    [EDIT]
    En fait, si un fichier DvdThèque existe, l'appli ne crée rien du tout, mais refuse d'enregistrer. Normal.
    Bon c'est pas bien grave, mais je vais quand même changer dans mon exemple.
    Surtout que j'ai mis "merci Eddy58", et c'est toi qui vas te faire eng..  ;D
  • ClicCoolClicCool Membre
    18:38 modifié #12
    Et oui, ;)

    le terme file peut recouvrir des tas de choses selon le type de file justement:

    The following NSString constants are the possible values for the NSFileType attribute key:

    NSFileTypeDirectory: Directory

    NSFileTypeRegular: Regular file

    NSFileTypeSymbolicLink: Symbolic link

    NSFileTypeSocket: Socket

    NSFileTypeCharacterSpecial: Character special file

    NSFileTypeBlockSpecial: Block special file

    NSFileTypeUnknown: Unknown
  • TiffTiff Membre
    septembre 2004 modifié #13
    Bon, alors, tout va bien ?
    ça m'a donné l'occasion de faire fonctionner mon NSLog(@Et toi là  haut..);
    Stressant, une appli qui ne veut pas quitter !

    Je l'ai déjà  dit dans un autre post, mais Eddy58 a raison. Il est plus sûr d'ajouter isDirectory.

    [EDIT]
    Soit j'ai mal recopié, soit il y a un problème.
    J'ai laissé mon fichier DvdThèque ; il n'y a pas création d'un dossier DvdThèque.
    Manuellement, Finder râle car les deux portent le même nom. Du coup, isDirectory est insuffisant. Si le file existe et n'est pas un dossier, il faut changer le nom du dossier que l'on veut créer. Quel bazar.
    Me suis-je trompé en recopiant le code ? Ou est-ce vraiment la ch.. ?
  • Eddy58Eddy58 Membre
    septembre 2004 modifié #14
    Pourquoi tu n'effaces pas ton fichier DVDThèque ? Je n'en vois pas l'utilité... :)

    [EDIT]
    Je viens d'essayer, j'ai créé un fichier, puis ensuite fais fonctionner la procédure, et bien le répertoire, portant le meme nom que le fichier, se crée sans problème.

    Surtout que j'ai mis "merci Eddy58", et c'est toi qui vas te faire eng.. 

    Je préfère plutôt ça :  :rose!: ok Tiff ?  :D
  • TiffTiff Membre
    18:38 modifié #15
    Il ne sert à  rien, juste à  voir ce qui se passe lorsqu'il y a conflit entre un fichier et un dossier qui portent le même nom.
    L'intérêt du isDirectory est de vérifier que DvdThèque est bien un dossier. Mais si c'est autre chose ? Que fait-on ?

    Pour l'instant, j'ai viré isDirectory, j'ai viré le fichier DvdT.. et je peaufine mes bindings de menus popup. Ce que je veux, c'est avoir une appli utilisable le plus rapidement possible.  :'(
  • Eddy58Eddy58 Membre
    18:38 modifié #16
    Je comprend pas.....
    Ca marche bien chez moi......
    T'es sur que t'essaies pas de faire fonctionner ça sur Windows pour obtenir un message d'erreur ?  ;D
  • TiffTiff Membre
    18:38 modifié #17
    ça marche si le fichier a une extension (même cachée).
    Mais j'ai pris mon fichier DvdThèqueData, que j'ai renommé DvdThèque. Et là , Finder n'en veut pas car "Le nom "DvdThèque" esiste déjà . Veuillez choisir un autre nom."

    C'est quoi vindauze ?  ???
  • Eddy58Eddy58 Membre
    18:38 modifié #18
    Ouai effectivement....en enlevant l'extension du fichier il met un message d'erreur....ben Tiff je crois qu'on peut pas y faire grand chose :(, le filesystem n'est tout simplement pas conçu pour différencier un fichier et un répertoire portant le même nom. Donc plus la peine de chercher le pourquoi du comment. ;)
  • TiffTiff Membre
    18:38 modifié #19
    ça me donne une idée dans mon exemple de code pour une appli sans doc. Je vais enlever le isDirectory. Et si l'appli refuse d'enregistrer, je lui ferai afficher un panneau d'alerte indiquant qu'il y a peut-être conflit entre un dossier et un fichier, ou alors que le disque est plein, ou alors que l'utilisateur n'a pas les autorisations nécessaires, ou alors ? Peut-il y avoir d'autres raisons ?  :P
  • ClicCoolClicCool Membre
    18:38 modifié #20
    Volume introuvable
    Volume ejecté
    Volume protégé en écriture
    Fichier déjà  ouvert par une autre appli
    Fichier corrompu
    Données corrompues

    .../... pleins de raisons de mettre un garde fou s'assurant que l'enregistrement a bien eu lieu n'est-ce pas ? ;) ;D
  • TiffTiff Membre
    18:38 modifié #21
    Ce n'est plus un panneau d'alerte, c'est un écran 30" d'alerte qu'il faudra !  ;D

    Une parenthèse pour ClicCool : je me suis arraché les cheveux avec les menus popup dans les TableView, jusqu'à  ce que je trouve le "bug" de I.B. :
    Si une colonne avec des cellules normales (Default Data Cells) est déjà  bindée avec Value, lorqu'on lui balance des cellules popup, la colonne se retrouve bindée avec Parameters, sans que l'on s'en rende forcément compte. Bien sûr, l'appli plante systématiquement, jusqu'à  ce qu'on débinde (quand je pense à  Ferninde) les Parameters. Suis-je clair ?  :P
    Mon appli DvdThèque est presque opérationnelle, je n'ai plus qu'à  ajouter une méthode pour récupérer les données de VidéothèqueData.
    Une fois terminé, tout paraà®t si évident !!!
  • Eddy58Eddy58 Membre
    18:38 modifié #22
    dans 1096281121:

    ça me donne une idée dans mon exemple de code pour une appli sans doc. Je vais enlever le isDirectory. Et si l'appli refuse d'enregistrer, je lui ferai afficher un panneau d'alerte indiquant qu'il y a peut-être conflit entre un dossier et un fichier, ou alors que le disque est plein, ou alors que l'utilisateur n'a pas les autorisations nécessaires, ou alors ? Peut-il y avoir d'autres raisons ?  :P


    Tu dois normalement pouvoir utiliser une méthode déléguée du callback handler de NSFileManager pour pouvoir déterminer l'erreur non ?

    - (BOOL)fileManager:(NSFileManager *)manager shouldProceedAfterError:(NSDictionary *)errorInfo
  • TiffTiff Membre
    18:38 modifié #23
    ça y est, un ClicCool bis, qui me donne du boulot intéressant, alors qu'il me reste 50 copies à  corriger pour demain.  :'(

    Je vais essayer d'attendre ce soir pour aller voir ça. ça va être dur de résister à  la tentation.  ;)

    Bande de sadiques  ;D
  • ClicCoolClicCool Membre
    18:38 modifié #24
    dans 1096284751:

    ilme reste 50 copies à  corriger pour demain.  :'(



    Pour ça tu devrais pouvoir utiliser un NSValidateValue
    regardes aussi du coté de copyWithZone peut-être ?  ;D :P
  • TiffTiff Membre
    18:38 modifié #25
    Là , je cherche plutôt du côté de Random().  8)
Connectez-vous ou Inscrivez-vous pour répondre.