Retrouver un fichier

orfaitorfait Membre
15:33 modifié dans API AppKit #1
Bonjour,

Je viens chercher de l'aide par ici car je suis confronté à  un problème depuis plusieurs jours... il s'agit de retrouver un fichier.
Plutôt que d'essayer d'expliquer de façon abstraite, je vais faire un exemple.
Mon application doit se charger de gérer une collection de mp3. Alors imaginons, l'utilisateur a scanné son répertoire de mp3 pour avoir diverses informations directement dans un fichier au format xml (titre, auteur, genre et BPM). Dans ce fichier se trouve aussi le chemin du fichier mp3. Jusque là , rien de bien complexe. Mais là  où ça se complique, c'est que si l'utilisateur déplace un fichier (application fermée), il faut retrouver ce fichier de façon transparente, sans ramer et sans tout rescanner (ou alors, rescanner très très vite sans tout faire ramer).
Pire : l'utilisateur déplace le fichier, le renomme et change l'ID3 tag.

J'ai vu une fonction identique sur un soft de DJ sur un PC. Alors outre le fait que je suis persuadé que c'est possible, je me demande comment...


Alors si quelqu'un a une idée, ou tout simplement une piste, je suis preneur... et il n'y a pas d'idée idiote !


Merci à  ceux qui se pencheront sur mon problème.

Réponses

  • schlumschlum Membre
    15:33 modifié #2
    Utiliser Spotlight ?
  • NoNo Membre
    15:33 modifié #3
    Stocker des alias plutôt que des chemins en dur ?
  • orfaitorfait Membre
    15:33 modifié #4
    J'y ai pensé, mais j'ai oublié un détail : il faudrait assurer un minimum de portabilité vers windows de la bdd xml.
    SI c'est impossible, je ferais une solution à  base de spotlight... c'est une bonne idée  8--)

    En fait, il n'existerait pas un identificateur unique pour chaque fichier ?
  • schlumschlum Membre
    15:33 modifié #5
    dans 1215095055:

    En fait, il n'existerait pas un identificateur unique pour chaque fichier ?


    Si, les inodes dans une certaine mesure...
    Mais sur les systèmes UNIX, c'est impossible de retrouver un chemin à  partir de l'inode (particulièrement à  cause des hardlinks)
    Il existe cependant une fonction qui donne le dernier stocké dans la cache du système (me souviens plus son nom...)
  • NoNo Membre
    15:33 modifié #6
    dans 1215095055:

    J'y ai pensé, mais j'ai oublié un détail : il faudrait assurer un minimum de portabilité vers windows de la bdd xml.


    Si tu as la maitrise sur la bd xml, alors, ajoute un champ contenant le chemin en dur, et ajoute un champ de type data/blob contenant les données de l'alias. Ce dernier champ sera utilisé seulement sous environnement Mac.
  • orfaitorfait Membre
    15:33 modifié #7
    Merci pour les réponses, c'est instructif !

    Alors j'ai oublié un détail qui a sont importance :les fichiers peuvent être renommés/déplacés sur un autre système. Et aussi, supprimés puis recopiés à  nouveau. Même si c'est le même fichier, ça coince aussi à  ce niveau.

    Donc finalement, je crois que je vais devoir rescanner à  chaque fois.
  • schlumschlum Membre
    15:33 modifié #8
    Si c'est déplacé sur un autre FS (FileSystem), ce n'est plus le même fichier. Il y a copie, puis suppression de l'original.
  • orfaitorfait Membre
    15:33 modifié #9
    Plus j'avance et plus je vois le sac de noe“uds qu'on m'a refilé...

    Car l'autre détail qui est aussi important, c'est que dodoze ne veut pas de HFS tout comme OSX ne veut pas écrire sur du NTFS, donc la synchronisation est faite sur un poste avec MacDrive ou bien sur OSX (juste dans le sens disque NTFS vers HFS).

    Donc je crois que ca va tourner sur les dates de modification des répartoires et des inodes (ou MD5) des fichiers.


    Je pense qu'on peut stopper le topic à  ce niveau (sauf idée géniale) puisque à  partir de là , c'est de la patience qu'il me faut (surtout que c'est pas moi qui fait le dev sur windows).

    Encore merci pour les réponses !
  • AliGatorAliGator Membre, Modérateur
    15:33 modifié #10
    Carbon utilisait les "FSRef" pour identifier de façon unique les fichiers, indépendamment de leur chemin d'accès. Mais je ne sais plus s'ils sont sensibles ou pas aux déplacements du fichier.
    Sinon les pistes des inodes ou des aliases est à  mon avis le plus adéquat.
  • juillet 2008 modifié #11
    Solution plus radicale: Stocker l'image dans le XML ?
    OK ça alourdi...  Alors pourquoi ne faire 2 XMLs ? Un qui serait un XML qui contient les covers et/ou autres infos lourde que tu enregistres sous une extension genre .library. Le XML léger contiendrait les tracks + l'index où retrouver les covers sur l'autre fichier.
    Là  tu me dis "OK, mais si ils le supprime ?" Et ben tant pis pour eux ! Si je supprime le fichier iTunes Library je perds tout.. tu peux tester en le déplaçant simplement ailleurs, et ensuite tu lances iTunes. Résultat : Biblio complètement vide.

    Je pense qu'il faut allez chercher trop loin et prendre au plus simple.

    Tu as peut-être un côté négatif dans cette solution (mais dans ce cas, iTunes en a un gros aussi). Mais d'un autre côté c'est pas mal car :
    - On peut pas faire plus simple
    - L'utilisateur a pas forcément envie de stocker ses images dans un dossier. Personnellement je suis content que iTunes me stocke ça je ne sais où et que j'en entende plus parler. Il gère comme un grand. Je peux supprimer l'image originale sans problème.

    Après la solution des alias, c'est bien. Ptete plus compliqué, mais bien. Sauf que, si l'utilisateur supprime l'image de son disque dur ? :)

    Edit : Boulet inside  ;D
  • orfaitorfait Membre
    juillet 2008 modifié #12
    Je ne comprends pas bien le dernier message...

    Ce que je cherche à  faire, c'est une sorte de synchronisation entre deux lieux de stockage, mais avec prise en charge du fait qu'un fichier ai pu être renommé/déplacé/modifié.
    Il n'y a pas d'image associée à  un mp3  ???
  • schlumschlum Membre
    15:33 modifié #13
    dans 1215118164:
    Personnellement je suis content que iTunes me stocke ça je ne sais où et que j'en entende plus parler. Il gère comme un grand. Je peux supprimer l'image originale sans problème.


    Euh... dans les tags ID3v2, là  où il faut  :o
    Mais pourquoi parles-tu des images ? Je ne vois pas le rapport avec le sujet...
  • juillet 2008 modifié #14
    J'vais me coucher...  :o :o
    en fait j'ai lu "BMP" à  la place de "BPM" et j'ai tilté (je ne sais pas pourquoi) sur les images....  :(renaud):
    Boulet inside  ;D ;D ;D

    Au moins ça me fait rire la veille des résultats du bac

    Et pis ça doit être à  cause du fait que je touche beaucoup à  iTunes et aux covers en ce moment. Franchement désolé si à  chaque fois que je poste je dis de la merde  ;D
  • orfaitorfait Membre
    15:33 modifié #15
    dans 1215122551:

    Et pis ça doit être à  cause du fait que je touche beaucoup à  iTunes et aux covers en ce moment. Franchement désolé si à  chaque fois que je poste je dis de la merde  ;D

    C'est ce que j'avais supposé  ;)
  • orfaitorfait Membre
    15:33 modifié #16
    Alors pour la petite histoire : je viens de tâter du FSRef et c'est super. C'est sensible au déplacement de fichier et ça me convient très bien.
    Donc je vais très très probablement utiliser ça, malgré la taille (640 bits).

    Je viens d'envoyer la balle dans le camp du programmeur sous windows, j'attends de connaitre sa solution pour son système. Après, on verra comment synchroniser... ce sera probablement une véritable usine à  gaz...
  • schlumschlum Membre
    15:33 modifié #17
    Euh... FSRef suis le déplacement (copie/suppression) d'un FS à  un autre ?
    ça m'étonne beaucoup ça...  ???


  • NseaProtectorNseaProtector Membre
    15:33 modifié #18
    Je vais peut-être dire une bêtise mais au cas ou:
    J'ajouterais un drapeaux sur chaque entrées dans le xml avec pour valeur 0
    Au chargement du xml je lancerais un thread charger de vérifier la validité de chaque chemin et je passerais le drapeau à  1
    Lors d'un accès a une entrée si le drapeau est à  1 je ferais confiance au chemin sinon je recherche le fichier
    Et enfin lors de la sauvegarde du xml, je ferais un clone avec tous les drapeaux à  0
  • orfaitorfait Membre
    15:33 modifié #19
    schlum : mon système ne doit gérer qu'un changement de place sur le même disque. Donc pas de problème sur ce plan.

    NseaProtector : j'avais ce genre d'idée mais comme je ne stocke plus de chemin, il suffit de vérifier les FSRef au fur et à  mesure.


    Bref, j'attends toujours la solution côté windows...
  • schlumschlum Membre
    15:33 modifié #20
    Qu'est-ce qui se passe avec le FSRef, si tu fais un hardlink sur le fichier, puis tu ouvres ce hardlink, tu le déplaces et tu l'effaces ?
  • orfaitorfait Membre
    15:33 modifié #21
    J'ai pas tout compris à  ta question... mais je voulais dire que j'oublie le FSRef : il change au démontage/remontage du volume.

    En revanche, ce qui ne change pas, c'est le inode.
  • schlumschlum Membre
    15:33 modifié #22
    dans 1215272634:

    J'ai pas tout compris à  ta question... mais je voulais dire que j'oublie le FSRef : il change au démontage/remontage du volume.

    En revanche, ce qui ne change pas, c'est le inode.


    Si tes fichiers n'ont qu'une référence à  chaque fois, je peux essayer de te retrouver la fonction capable de retrouver le path à  partir de l'inode...
  • orfaitorfait Membre
    juillet 2008 modifié #23
    dans 1215272800:

    Si tes fichiers n'ont qu'une référence à  chaque fois, je peux essayer de te retrouver la fonction capable de retrouver le path à  partir de l'inode...


    Si tu trouves ça, c'est fabuleux !

    Sinon, je vais regarder encore 2 choses :
    - attributesOfItemAtPath:error:
    - NDAlias ( http://homepage.mac.com/nathan_day/pages/source.xml )



    EDIT1 : Avec ceci :
    NSError *error;<br />NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:[openPanel filename] error:&amp;error];<br /><br />NSLog(@&quot;%@&quot;,[dict objectForKey:NSFileSystemFileNumber]);
    

    J'obtiens le inode sans problème.

    EDIT2, le dernier :
    Avec NDAlias, je stocke les données dans un NSData écris dans un fichier xml, le fichier est toujours retrouvé, même après démontage et remontage du disque. Le changement de disque n'est pas géré (comme pour un alias classique). Et le déplacement d'un fichier sur windows n'est pas géré non plus.
  • schlumschlum Membre
    15:33 modifié #24
    L'inode ne suffit pas, il faut le device number aussi...
    On obtient les deux avec lstat.

    J'ai une fonction capable de donner le path à  partir d'un file descriptor :

    fcntl(fd,F_GETPATH,buffer);
    


    Ou à  partir d'un "vnode_t"

    vn_getpath(vnodeP,buffer,&amp;lg);
    


    Mais je n'arrive pas à  trouver comment créer un vnode_t ou un file descriptor à  partir du ino_t et du dev_t...
Connectez-vous ou Inscrivez-vous pour répondre.