Bonjour, Dans un traitement gérant l'arrivée de fichiers dans un répertoire, j'ai besoin de savoir si un fichier est en cours de copie afin de na pas le traiter avant la fin de sa réception. Cela est-il possible ? D'avance merci.
Bonjour, Dans un traitement gérant l'arrivée de fichiers dans un répertoire, j'ai besoin de savoir si un fichier est en cours de copie afin de na pas le traiter avant la fin de sa réception. Cela est-il possible ? D'avance merci.
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
Ca dépend des Unix mais beaucoup implémentent la commande fuser:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $ fuser /lib/libc.so /lib/libc.so: 15039m 14957m 14956m 3565m 3404m 18197m 24524m 17423m 17421m 3048m 3041m 3034m 3032m 447m 420m 409m 408m 380m 357m 355m 346m 340m 338m 328m 327m 326m 318m 314m 312m 290m 287m 272m 263m 207m 197m 144m 140m 133m 127m 76m 15m 11m 9m 1m
ɹǝsn *sıɹɐlos*
Merci, mais je ne suis pas un spécialiste. En quoi cette commande peut me dire si le fichier x est en cours de copie;
Si le fichier n'est plus en cours de copie, la commande ne retourne rien, c'est cela?
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
fuser te permet de savoir si le fichier est ouvert ou non par un processus (avec les identifiants des processus).
S'il ne retourne rien, le fichier n'est pas ouvert.
En fait, tu ne peux pas savoir si un fichier est en cours de copie, car du point de vue du systeme, ca ne veut rien dire
Comment savoir, algorithmiquement parlant, qu'un fichier est en cours de copie ?
Par exemple :
mon processus ouvre le fichier, le lit en entier, ferme le fichier, puis fait une pause, puis l'ecrit : conceptuellement, il fait bien une copie de fichier. Mais une fois qu'il l'a lu et ferme, il ne pourra plus savoir s'il y a des modifications, et donc il n'est pas "en train" de le copier.
Si tu maîtrise le process qui génère le fichier, tu peux ajouter la création d'un fichier témoin à la fin de ton fichiers de données.
Et ton programme consommateur est en attente du fichier témoin et non pas du fichier de données.
Ce principe est également adapté lorsque l'on est en attente de plusieurs fichiers. Cela "flag" l'arrivée et la disponibilité d'un lot de fichiers à traiter.
dans cette optique je pense que j'observerais simplement l’évolution de la taille des fichiers au fil du temps, selon la granularité on peut par exemple envisager un check en cron toutes les minutes, si la taille du fichier n'a pas changé lors du prochain check c'est qu'il n'est pas en cours de copie
après ça dépend, comme dit si tu as la main sur le serveur (ftp par exemple ?) il est peut-etre possible de lui configurer un répertoire temporaire pour l'upload ou un script qui s'exécute à chaque fin d'upload etc. ce sera forcément plus avantageux comme solution
Ca n'est pas garanti, il peut y avoir par exemple une saturation réseau qui fait que la taille ne va pas évoluer pendant un temps conséquent ou alors, le processus émettant les données peut le faire de façon discontinue. C'est aussi très long alors que fuser permet de savoir immédiatement si le fichier est en cours d'utilisation, ce qui répond au besoin exprimé (sauf cas tordu décrit par gangsoleil).
exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 file="/tmp/toto" if [ "$(fuser "$file" 2>/dev/null)" ]; then echo "$file est en cours de lecture ou écriture !" fi
ɹǝsn *sıɹɐlos*
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager