Détecter fichiers placés dans la corbeille

helgrindhelgrind Membre
18:44 modifié dans API AppKit #1
Bnojour,

Y a t-il un moyen de savoir (notifications, ...) lorsqu'un fichier est jetté à  la corbeille?

Merci.

Réponses

  • BruBru Membre
    18:44 modifié #2
    Que veux tu savoir réellement ?
    Si un fichier à  toi est jeté à  la corbeille alors que ton appli tourne ?
    Ou n'importe quel fichier ?

    Et c'est pour faire quoi au juste ?

    .
  • helgrindhelgrind Membre
    18:44 modifié #3
    dans 1201959860:

    Que veux tu savoir réellement ?
    Si un fichier à  toi est jeté à  la corbeille alors que ton appli tourne ?
    Ou n'importe quel fichier ?

    Et c'est pour faire quoi au juste ?

    Quand n'importe quel fichier est jeté à  la corbeille, pour pouvoir ensuite les ouvrir avec une app.
  • BruBru Membre
    18:44 modifié #4
    dans 1201962386:

    Quand n'importe quel fichier est jeté à  la corbeille, pour pouvoir ensuite les ouvrir avec une app.


    Drole d'idée... Mais pourquoi pas.

    S'il s'agit de faire quelque chose quand l'utilisateur dépose un fichier dans la corbeille, tu peux essayer d'utiliser les FSEvent afin de monitorer le répertoire ~/trash (je t'aurai bien dit d'essayer les "actions de dossier", mais je ne vois pas trop comment les configurer sur le rep Trash qui est invisible dans le Finder).

    .
  • helgrindhelgrind Membre
    18:44 modifié #5
    dans 1201968358:

    Drole d'idée... Mais pourquoi pas.

    S'il s'agit de faire quelque chose quand l'utilisateur dépose un fichier dans la corbeille, tu peux essayer d'utiliser les FSEvent afin de monitorer le répertoire ~/trash (je t'aurai bien dit d'essayer les "actions de dossier", mais je ne vois pas trop comment les configurer sur le rep Trash qui est invisible dans le Finder).


    J'avais pensé à  ça mais il me semble que c'est une API privée, mais si c'est le seul moyen...

    J'ai déjà  essayé les actions de dossier mais ça ne fonctionne pas très bien, c'est un peu aléatoire.
  • schlumschlum Membre
    18:44 modifié #6
    Cherche un exécutable open-source nommé "gfslogger"  ;)
    (Attention par contre, licence GPL, donc à  ne pas inclure dans un produit non open-source)
    Je crois que ça vient de quelqu'un de chez Apple...
  • helgrindhelgrind Membre
    18:44 modifié #7
    dans 1201991684:

    Cherche un exécutable open-source nommé "gfslogger"  ;)
    (Attention par contre, licence GPL, donc à  ne pas inclure dans un produit non open-source)
    Je crois que ça vient de quelqu'un de chez Apple...

    Oui merci j'ai déjà  trouver ;)

  • helgrindhelgrind Membre
    février 2008 modifié #8
    Maintenant j'ai un autre problème: comment lancer une application par un processus root et que le possesseur de cette application soit l'utilisateur de la machine et non root?

    Je crois que j'ai trouver la réponse moi-même:
    A common question we get in DTS is "How can I launch a GUI application from my daemon?" The answer is that you can't.

    http://developer.apple.com/technotes/tn2005/tn2083.html
  • schlumschlum Membre
    18:44 modifié #9
    Si, on peut, bien sûr !
    man setuid
  • helgrindhelgrind Membre
    18:44 modifié #10
    dans 1202039683:

    Si, on peut, bien sûr !
    man setuid


    Et on fait comment pour récupérer l'uid de l'utilisateur ?

  • helgrindhelgrind Membre
    18:44 modifié #11
    Bon j'ai résolu le problème en faisant un helper pour recevoir les notifications envoyées par le daemon.
    Ce daemon est en partie constitué du code gfslogger, et des notifications sont envoyées lorsqu'un fichier est jetté.

    Comme les notifications prennent un certain temps à  être envoyées, si on jette plusieurs fichiers à  la fois, certains fichiers ne sont pas interceptés.

    Comment remédier à  ça?

  • schlumschlum Membre
    18:44 modifié #12
    Il faut être très prudent avec "gfslogger"...

    - Utiliser un thread qui traite très vite les données reçues ; on ne peut pas se permettre de le bloquer trop longtemps sinon son buffer explose
    - En cas de forte activité du FS (ex, dé-tarer un fichier qui contient des milliers d'éléments), il se bloque ; il faut le relancer
    ...
  • helgrindhelgrind Membre
    18:44 modifié #13
    dans 1202061122:

    Il faut être très prudent avec "gfslogger"...

    - Utiliser un thread qui traite très vite les données reçues ; on ne peut pas se permettre de le bloquer trop longtemps sinon son buffer explose
    - En cas de forte activité du FS (ex, dé-tarer un fichier qui contient des milliers d'éléments), il se bloque ; il faut le relancer
    ...


    D'accord mais comment traiter ces données et les envoyé très rapidement avec des notifications?

  • schlumschlum Membre
    18:44 modifié #14
    dans 1202062818:

    dans 1202061122:

    Il faut être très prudent avec "gfslogger"...

    - Utiliser un thread qui traite très vite les données reçues ; on ne peut pas se permettre de le bloquer trop longtemps sinon son buffer explose
    - En cas de forte activité du FS (ex, dé-tarer un fichier qui contient des milliers d'éléments), il se bloque ; il faut le relancer
    ...


    D'accord mais comment traiter ces données et les envoyé très rapidement avec des notifications?




    Un thread qui socke ça dans un buffer FIFO, un thread qui lit le même buffer avec une section critique sur la lecture et l'écriture du buffer.
  • helgrindhelgrind Membre
    18:44 modifié #15
    dans 1202063621:

    Un thread qui socke ça dans un buffer FIFO, un thread qui lit le même buffer avec une section critique sur la lecture et l'écriture du buffer.


    heu...  ;D
    Et en pratique ça donne quoi?
  • schlumschlum Membre
    18:44 modifié #16
    dans 1202065031:

    dans 1202063621:

    Un thread qui socke ça dans un buffer FIFO, un thread qui lit le même buffer avec une section critique sur la lecture et l'écriture du buffer.


    heu...  ;D
    Et en pratique ça donne quoi?



    Un truc assez tordu  :P
    Si tu veux pas te faire chier, tu l'écris dans un fichier et tu lis le fichier derrière...
  • helgrindhelgrind Membre
    18:44 modifié #17
    dans 1202065294:


    Un truc assez tordu  :P
    Si tu veux pas te faire chier, tu l'écris dans un fichier et tu lis le fichier derrière...


    OK, mais alors comment mon helper sait quand le fichier à  été modifié?
  • schlumschlum Membre
    18:44 modifié #18
    dans 1202065639:

    dans 1202065294:


    Un truc assez tordu  :P
    Si tu veux pas te faire chier, tu l'écris dans un fichier et tu lis le fichier derrière...


    OK, mais alors comment mon helper sait quand le fichier à  été modifié?


    En essayant de le lire régulièrement...
  • helgrindhelgrind Membre
    18:44 modifié #19
    Bon j'ai essayé d'écrire dans un fichier les données, mais il en manque quand même  ???

    fichier = fopen(&quot;/log.txt&quot;, &quot;a&quot;);<br />fputs(strcat((in_buf + pos), &quot;&#092;n&quot;), fichier);<br />fclose(fichier);
    


    Si je jette 4 fichiers d'un coup, seulement 2 ou 3 sont écrits dans le fichier.
  • schlumschlum Membre
    18:44 modifié #20
    à‰vite de rouvrir et refermer le fichier à  chaque fois... ça fait des I/O supplémentaires et ça plombe l'optimisation buffer.

    Mais je pense que ton adaptation de code doit avoir quelques bugs s'il en manque quand ça fait quasi-rien...  :P
  • helgrindhelgrind Membre
    18:44 modifié #21
    dans 1202119789:

    à‰vite de rouvrir et refermer le fichier à  chaque fois... ça fait des I/O supplémentaires et ça plombe l'optimisation buffer.

    Mais je pense que ton adaptation de code doit avoir quelques bugs s'il en manque quand ça fait quasi-rien...  :P

    Je vois pas trop ou peut se trouver le bug, c'est du copier-coller de gfslogger avec quelques trucs en moins  :)

    Je mets les source du daemon si quelqu'un veut jeter un coup d'oeil  ;)
  • schlumschlum Membre
    février 2008 modifié #22
    T'as tenu compte du fait qu'il n'y avait pas une seule poubelle, mais une par utilisateur (/Users/*/.Trash) et une par volume (/Volumes/*/.Trashes) ?

    Ah oui, aussi... Dans mon souvenir, souvent le nom du fichier passe par "FSE_ARG_INO" (enfin ça dépend de l'action ; en général la mise à  la poubelle, c'est un RENAME).
  • helgrindhelgrind Membre
    18:44 modifié #23
    dans 1202149209:

    T'as tenu compte du fait qu'il n'y avait pas une seule poubelle, mais une par utilisateur (/Users/*/.Trash) et une par volume (/Volumes/*/.Trashes) ?

    Ah oui, aussi... Dans mon souvenir, souvent le nom du fichier passe par "FSE_ARG_INO" (enfin ça dépend de l'action ; en général la mise à  la poubelle, c'est un RENAME).


    Non, j'ai pas tenu compte des différentes corbeilles, mais pour l'instant je veux simplement interceptés tous les fichiers qui sont jetés, sans exceptions.
    Et je demande de recevoir seulement les "RENAME".

    Mais j'ai jamais pu récupérer le chmein du fichier avec FSE_ARG_INO.
  • schlumschlum Membre
    18:44 modifié #24
    Houlà , je vois que tu fais un strcat directement sur le buffer de travail de gfslogger... À éviter surtout.
  • helgrindhelgrind Membre
    18:44 modifié #25
    dans 1202154055:

    Houlà , je vois que tu fais un strcat directement sur le buffer de travail de gfslogger... À éviter surtout.


    Je fais ca pour avoir des retours à  la ligne dans le fichier, sinon je vois pas trop comment le parser après.
    Ecrire les données en xml serait mieux?
  • schlumschlum Membre
    18:44 modifié #26
    Je ne sais pas... Ce que je sais c'est qu'un jour j'avais essayé de remplacer les \t qu'il ajoute à  la fin des noms de liens symboliques par des \0 et ça lui faisait rater plein de choses par je ne sais quel mécanisme obscur  ::)
  • helgrindhelgrind Membre
    18:44 modifié #27
    J'ai pensé à  quelque chose: est-ce que c'est possible que j'affiche les fichiers à  coups de printf depuis mon daemon, et que je "connecte" mon helper à  sa sortie pour pouvoir récupérer ces printf ?
  • schlumschlum Membre
    18:44 modifié #28
    Oui, avec un pipe ("|")...
  • helgrindhelgrind Membre
    18:44 modifié #29
    dans 1203193513:

    Oui, avec un pipe ("|")...

    Oui, mais comment?
    Mon daemon est lancé par launchd en root.
    Comment je connecte mon helper à  son stdout?

  • schlumschlum Membre
    18:44 modifié #30
    Ah ben non, s'il est lancé extérieurement, il faut procéder autrement...
    Pour ça que l'écriture dans un fichier c'est universel !
Connectez-vous ou Inscrivez-vous pour répondre.