Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2798 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] savoir si un fichier est déjà ouvert

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] savoir si un fichier est déjà ouvert

n°451889
KSauzeRK
Posté le 09-07-2003 à 10:19:59  profilanswer
 

Bonjour,
 
2 questions, (sous UNIX, en C / Script Shell) :  
 
- Y'a-t-il un moyen de savoir si un fichier est ouvert par une autre application?  
 
Le contexte : sur un serveur UNIX, je dois surveiller l'arrivée de fichiers dans un répertoire donné. Ces fichiers sont accompagnés d'un fichier "flag" qui signale la fin du transfert. Je dois vérifier que chaque fichier est bien accompagné de son fichier flag, sinon il faut signaler l'erreur. Donc, en script shell, je liste les fichiers, et vérifie la présence du fichier flag. Seulement, le fichier peut être en cours de transfert, dans ce cas je ne dois pas signaler d'erreur. Donc je voudrais savoir s'il y'a moyen de savoir si le fichier est ouvert par une autre application.
 
- Y'a-t-il un moyen de savoir depuis combien de temps un fichier est dans un répertoire donné ?  
 
Merci.

mood
Publicité
Posté le 09-07-2003 à 10:19:59  profilanswer
 

n°451899
HelloWorld
Salut tout le monde!
Posté le 09-07-2003 à 10:32:33  profilanswer
 

Et si tu tentes d'ouvrir en écriture le fichier ouvert par une autre appli, ça échoue non ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°451903
KSauzeRK
Posté le 09-07-2003 à 10:37:09  profilanswer
 

HelloWorld a écrit :

Et si tu tentes d'ouvrir en écriture le fichier ouvert par une autre appli, ça échoue non ?


 
J'y avais pensé, mais en tentant en C un open en mode O_RDONLY, O_WRONLY et O_RDWR sur un fichier en train d'"arriver" par FTP, les 3 passent...merci quand même

n°451910
polo021
Posté le 09-07-2003 à 10:40:58  profilanswer
 

_fileno
 

Citation :

The result is undefined if stream does not specify an open file.


 
ca peut peut etre t'aider [:spamafote]

n°451921
KSauzeRK
Posté le 09-07-2003 à 10:50:08  profilanswer
 

polo021 a écrit :

_fileno
 

Citation :

The result is undefined if stream does not specify an open file.


 
ca peut peut etre t'aider [:spamafote]


 
Merci, j'ai regardé le man, mais euh...pour lui filer un stream correspondant au fichier, faut bien que je fasse un fopen non? du coup le fichier sera fortement ouvert...me trompe-je? A moins que je puisse juste associer un FILE à un fichier sans l'ouvrir :??:

n°451927
polo021
Posté le 09-07-2003 à 10:56:17  profilanswer
 

KSauzeRK a écrit :


A moins que je puisse juste associer un FILE à un fichier sans l'ouvrir :??:  


Je sais pas si il y a moyen de faire ca . J'espere pour toi.[:spamafote]

n°451934
western
AJMM
Posté le 09-07-2003 à 11:05:55  profilanswer
 

KSauzeRK a écrit :

Bonjour,
 
2 questions, (sous UNIX, en C / Script Shell) :  
 
- Y'a-t-il un moyen de savoir si un fichier est ouvert par une autre application?  


Lors qu'un fichier est ouvert, il y a des flags qui sont positinnés, donc il faut les vérifier (man stat/fstat/lstat, je crois)

KSauzeRK a écrit :


Le contexte : sur un serveur UNIX, je dois surveiller l'arrivée de fichiers dans un répertoire donné. Ces fichiers sont accompagnés d'un fichier "flag" qui signale la fin du transfert. Je dois vérifier que chaque fichier est bien accompagné de son fichier flag, sinon il faut signaler l'erreur. Donc, en script shell, je liste les fichiers, et vérifie la présence du fichier flag. Seulement, le fichier peut être en cours de transfert, dans ce cas je ne dois pas signaler d'erreur. Donc je voudrais savoir s'il y'a moyen de savoir si le fichier est ouvert par une autre application.
 
- Y'a-t-il un moyen de savoir depuis combien de temps un fichier est dans un répertoire donné ?  


Pareil: les flags st_atime, st_mtime et st_ctime (man stat/fstat/lstat)


 :ange:

n°451974
KSauzeRK
Posté le 09-07-2003 à 11:55:16  profilanswer
 

western a écrit :


Lors qu'un fichier est ouvert, il y a des flags qui sont positinnés, donc il faut les vérifier (man stat/fstat/lstat, je crois)
 
Pareil: les flags st_atime, st_mtime et st_ctime (man stat/fstat/lstat)
 
 :ange:  


 
merci, st_ctime contient l'information dont j'ai besoin pour savoir depuis quand le fichier a été déplacé / copié dans le répertoire en cours. Faudra que je vérifie le genre d'accès qui sont faits sur le fichier par contre, pour voir si c'est susceptible de modifier la valeur.
 
Par contre, je vois pas dans la structure stat ce qui se rapporte aux nombre d'ouvertures en cours sur le fichier :??:

n°452008
western
AJMM
Posté le 09-07-2003 à 12:25:28  profilanswer
 

KSauzeRK a écrit :


Par contre, je vois pas dans la structure stat ce qui se rapporte aux nombre d'ouvertures en cours sur le fichier :??:  


Je me rappelle plus (j'ai eu besoin de faire exactement la meme chose il y a 3 ou 4 ans) mais c'est une autre fonction qui marche comme fstat ...  
essaye de faire une recherche avec man et option -k ...
ou regarde les valeurs possibles de l'ERRNO, des fois que tu trouve une correspondant à un fichier déjà ouvert, ensuite, trouve la fonction (man -k ...) qui l'utilise

n°452060
Taz
bisounours-codeur
Posté le 09-07-2003 à 13:13:47  profilanswer
 

1) jete un oeil à man fuser
2) sinon il faut passer par fcntl (je regarde si j'ai le temps de te préparer un exemple
 
edit: quoi que je sais pas si on peut faire ça avec fcntl. je regarde en détail le man
 
la solution c'est aussi de regarder si ton appli qui ecrit le fichier peut le vérouiller: mais si t'as pas acces à son code...
 
je suis entrain de chercher une manière propre et atomique au niveau du système. sinon tu as toujours la possiblité de te balader dans /proc...


Message édité par Taz le 09-07-2003 à 13:23:31
mood
Publicité
Posté le 09-07-2003 à 13:13:47  profilanswer
 

n°452079
Taz
bisounours-codeur
Posté le 09-07-2003 à 13:43:44  profilanswer
 

non en fait je vois pas de solution unilatéral avec fcntl. pour avoir des verous non-coopératif, il faut changer les options de mount, et changer les droits sur ton fichier

n°452089
Taz
bisounours-codeur
Posté le 09-07-2003 à 13:53:08  profilanswer
 

j'ai aps compris votre histoire avec _fileno, j'ai pas le man. pour la solution de stat, je comprends pas non plus. moi j'ai l'impression qu'il n'y a pas de bonne solution (ça ne fonctionne que sous linux (non-POSIX): remount, etc, et c dangereux, meme le root ne peut rien faire) mis à part des appli qui coopérent. apparemment ce n'est pas le cas: donc à toi de tenter ta chance de manière pas atomique

n°452111
KSauzeRK
Posté le 09-07-2003 à 14:10:56  profilanswer
 

++Taz a écrit :

j'ai aps compris votre histoire avec _fileno, j'ai pas le man. pour la solution de stat, je comprends pas non plus. moi j'ai l'impression qu'il n'y a pas de bonne solution (ça ne fonctionne que sous linux (non-POSIX): remount, etc, et c dangereux, meme le root ne peut rien faire) mis à part des appli qui coopérent. apparemment ce n'est pas le cas: donc à toi de tenter ta chance de manière pas atomique


 
Merci d'avoir cherché, j'avais regardé le man de fcntl aussi, ca me semblait pas possible.
 
Mais en fait je crois que fuser correspond à ce que je veux: il me permet de savoir si le fichier est utilisé par un processus, a priori c'est nickel. J'ai testé avec un fichier transferé par FTP, ca fonctionne.
 
Pour le stat, c'était pour la 2ème question : savoir depuis combien de temps un fichier se trouve dans un répertoire donné (normalement il y arrive par un mv ou cp) : le champ st_ctime a l'air de convenir.
 
Le fileno : euh ... c'était une piste un peu tordue en se servant du fait que fileno a un comportement indeterminé si le fichier renseigné par le FILE n'est pas ouvert...
 
Mais bon en fin de compte, savoir si le fichier est utilisé par un autre processus devrait suffire, donc fuser = nickel  :)  
 
Merci à tous ceux qui ont répondu !

n°1871946
HyperCed
Posté le 10-04-2009 à 11:56:16  profilanswer
 

KSauzeRK a écrit :


 
Merci d'avoir cherché, j'avais regardé le man de fcntl aussi, ca me semblait pas possible.
 
Mais en fait je crois que fuser correspond à ce que je veux: il me permet de savoir si le fichier est utilisé par un processus, a priori c'est nickel. J'ai testé avec un fichier transferé par FTP, ca fonctionne.
 
Pour le stat, c'était pour la 2ème question : savoir depuis combien de temps un fichier se trouve dans un répertoire donné (normalement il y arrive par un mv ou cp) : le champ st_ctime a l'air de convenir.
 
Le fileno : euh ... c'était une piste un peu tordue en se servant du fait que fileno a un comportement indeterminé si le fichier renseigné par le FILE n'est pas ouvert...
 
Mais bon en fin de compte, savoir si le fichier est utilisé par un autre processus devrait suffire, donc fuser = nickel  :)  
 
Merci à tous ceux qui ont répondu !


 
Comment fais-tu pour utiliser ce fuser?
J'ai essayé de créer un fichier vide avec touch test.txt
Puis je l'ai ouvert avec pico : pico test.txt
Et avec une autre session, j'ai fait un fuser test.txt
 
Je n'ai aucun retour. Pourtant le fichier est bien ouvert en écriture...
 
J'ai essayé avec sudo aussi et rien...
 
Sais-tu ce que je fais mal?
 
Merci
 

n°1871977
Un Program​meur
Posté le 10-04-2009 à 13:27:59  profilanswer
 

Rien de standard a ma connaissance (ni C, ni POSIX); mais cherche apres lsof, ca fait ce que tu veux -- je ne sais pas avec quel ampleur la portabilite est sacrifiee; la version disponible ici ne semble pas suid root, c'est deja ca.
 
Au contraire de Windows, ouvrir un fichier deja ouvert ne pose generalement pas de probleme sous POSIX (certains unix ont du "mandatory locking", chercher dans leur doc comment le mettre en place).
 
_fileno, ce ne serait pas encore du Windows ca?  En prime, je parie qu'il s'agit de quelquechose purement local au process.  Si c'est sense etre l'equivalent du POSIX fileno, ca passe d'un stream (alias FILE*) a un descripteur de fichier et c'est bien purement local au process, ca n'indique rien globalement.

n°1872024
HyperCed
Posté le 10-04-2009 à 14:58:16  profilanswer
 

Avec lsof, ça ne remonte pas non plus mon fichier.
 
J'ai fait ça :
lsof | grep test.txt  et rien...

n°1872030
tpierron
Posté le 10-04-2009 à 15:08:53  profilanswer
 

Essaye autre chose qu'un éditeur de texte, car je doute fortement que pico maintienne un descripteur en écriture une fois le fichier ouvert et lu en mémoire.

n°1872034
HyperCed
Posté le 10-04-2009 à 15:15:12  profilanswer
 

Qu'est-ce qu'un descripteur en écriture exactement?
Comment savoir si une appli le maintient ou pas?
Est-ce qu'un transfert ftp le maintient?

n°1872123
Un Program​meur
Posté le 10-04-2009 à 17:19:22  profilanswer
 

HyperCed a écrit :

Qu'est-ce qu'un descripteur en écriture exactement?


 
Une valeur retournee par open avec un flag O_WRONLY ou O_RDWR (ou creat, ou une fonction des sockets j'en oublie peut-etre encore) et non encore passee a close.
 

Citation :

Comment savoir si une appli le maintient ou pas?


lsof me semble la methode la plus simple.

Citation :

Est-ce qu'un transfert ftp le maintient?


Je ne vois pas de raison pour un client ou un serveur FTP ecrivant un fichier de ne pas le garder ouvert jusqu'a ce que le transfert soit termine.  Naturellement, on est sur de rien.

n°1872127
HyperCed
Posté le 10-04-2009 à 17:26:10  profilanswer
 

Ca fonctionne avec du ftp.
 
Génial!
 
Donc pico fait quoi, il ouvre le fichier, puis le met en RAM?
Et vire son flag d'écriture ou de lecture?
 
Ah oui, il doit juste mettre son flag d'écriture au moment de l'enregistrement et l'enlever juste après!!!
 
Ok, merci, j'ai tout compris!

n°1872155
Un Program​meur
Posté le 10-04-2009 à 20:52:19  profilanswer
 

Il ne conserve pas le fichier ouvert, purement et simplement.

n°1929076
rclsilver
Posté le 05-10-2009 à 18:16:36  profilanswer
 

Moi ce que je faisais dans un cas où moi aussi un programme devait récupérés des fichiers envoyés d'ailleurs : je faisais une première boucle où je stockais les cksum de chaque fichier présent, et je faisais une pause de 1 ou 2s, et ensuite, je refaisais une boucle, sur les fichier de ma liste. tous ceux dont le cksum n'avait pas changé, c'est qu'ils étaient terminés. dans ton cas, si le cksum n'a pas changé, tu n'as qu'a vérifier qu'un fichier .flag est présent, et tada. Mais bon, en lisant en diagonale, j'ai vu que d'autres solutions plus propres t'ont été proposées :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] savoir si un fichier est déjà ouvert

 

Sujets relatifs
[VB(A)] Accéder à un fichier quelconque à la position désirée...[ASP] Problème de cache IE, parade pr forcer le dl d'un fichier sur le
[VBA] Executer une macro à l ouverture d'un fichier excel [resolu][VB] Disposer les informations d'un fichier dans un tableau
Fichier integré au projet[Perl] lecture/écriture d'un fichier
[OPENGL] Créer un fichier .raw [RESOLU][Javascript] Peut-on savoir le nombre d'appel à une fonction ?
[PHP] Mettre un argument à un fichier en "include"modifier la premier ligne d'un fichier txt en ASP
Plus de sujets relatifs à : [C] savoir si un fichier est déjà ouvert


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR