IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Tester si un fichier est ouvert


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut Tester si un fichier est ouvert
    Bonsoir.

    Je travaille actuellement sur un projet de codage du protocole TFTP.
    Le but du jeu ici étant d'autoriser les lectures/écritures sur un hôte distant depuis un client.

    Que se passe-t-il quand deux clients veulent lire le même fichier ? Rien. Maintenant et j'en arrive à ma question, que se passe-t-il quand deux clients veulent accéder (concurremment forcément) à un fichier dont l'un en écriture ? Si on a de la chance rien, mais on sent déjà qu'on est mal parti avec ce genre de réponse.

    Par conséquent, y aurait-il un moyen astucieux de tester si un fichier est déjà ouvert ? Je ne viens pas ici, bien sûr, les mains vides, et ai déjà fais des recherches mais rien de bien convaincant.

    Cependant, je possède bien une idée : stocker les fichiers ouverts dans une table, en synchronisant les accès.

    Malheureusement c'est lourd, et si la synchro est mal faite, je ne fais que rajouter de la complexité à la complexité.

    Pour conclure, pourriez-vous m'apporter quelques éléments de réponse s.v.p ? Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Il te suffit de créer un fichier temporaire où tu effectueras les écriture pour un client puis, une fois l'écriture terminée, tu renommes le fichier original ( monFichier.back par exemple) et tu renomme ton fichier "temporaire" avec le nom du fichier original (monFichier.txt par exemple).

    Ainsi si tu as besoin de récupérer l'ancien fichier pour X raisons en cas de problèmes, tu pourras

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Si A fait son fichier temporaire, que B fait son fichier temporaire, que A fait sa copie, que B fait sa copie, alors B a gagné et A a perdu ?

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    En même temps... TFTP... pas sûr que le protocole assure une quelconque gestion de la concurrence en écriture de fichiers...
    Ca doit être le genre de trucs "dépendant de l'implémentation".

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Bonjour,

    Il n'existe pas de regle unique pour les ouvertures multiples de fichier.

    Sur Unix/Linux, la regle est que c'est le dernier qui ecrit qui gagne.

    Sur Windows, il en est de meme.

    Apres, rien n'empeche l'editeur du document de faire des verifications, mais cela suppose un unique endroit pour tous les locks, ce qui n'est pas forcement facile a trouver.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Si A fait son fichier temporaire, que B fait son fichier temporaire, que A fait sa copie, que B fait sa copie, alors B a gagné et A a perdu ?
    On ne copie pas, on renomme, c'est bien plus rapide.

    Comme on conserve les anciennes versions (après, on peut déterminer un nombre maximum de version, un temps de conservation, ...), A peut toujours récupérer son ancienne version et reproposer sa propre version.

    Après, que voudrais-tu faire dans ce cas-là?
    Même si on boque les écritures concurrantes, un utilisateurs peut toujours préparer sa propre version et la soumettre dès qu'il a le droit d'écrire, le resultat sera le même.
    Après il faut un gestionnaire de version, pas un FTP.

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    si tu veux implémenter un serveur tftp c'est pas si compliqué que ça, enfin tu gères le niveau de complication que tu désires.
    Tes clients envoient soit une demande le lecture soit une demande d'écriture. Tu dois de toute façon garder une liste d'opérations en cours et donc tu sais si une demande particulière peu ou non être satisfaite. Si tu ne peux la satisfaire tu envoies un message d'erreur.
    Ensuite c'est toi qui vois comment gérer ça. Imagine que deux clients sont en train de lire un fichier, puis un troisième client demande d'écrire ce même fichier.
    On peut imaginer que :
    * soit tu envoies une erreur (error code 2 = access violation ???) à celui qui veut écrire tant qu'il y a des lecteurs -> gestion simplifiée
    * soit tu écris le fichier dans un endroit temporaire en attendant qu'il n'y ait plus de lecteurs puis tu écrases le fichier d'origine en refusant tout nouvel accès en lecture ou écriture tant que l'écriture n'est pas terminée -> gestion plus complexe

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Je ne sais pas que ce que je voudrais faire justement......

    J'ai dit "copie" pour schématiser

    Je pose simplement la question de l'accès concurrent. Je pense qu'il y a une différence entre dire : "le dernier qui écrit a gagné en sachant qu'il écrase les modifications de quelqu'un d'autre" et "le dernier qui écrit a gagné sans rien savoir". Mais je crois que Metalman puis kwariz donnent la réponse : c'est au choix de l'implémentation si le protocole ne spécifie pas ce point.

    @gangsoleil : sous Windows, tu peux écrire un fichier alors que quelqu'un l'a déjà ouvert en écriture ? Il me semblait que non justement :s

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    ^L'implémentation par défaut de fopen() sous Windows ouvre sans aucune protection; la version fopen_s() pose un verrou lecteurs/écrivain sur le fichier.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Merci pour cette précision !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    merci pour toutes ces réponses, c'est vraiment intéressant.

    Je pense que la solution de Kwariz est la plus abordable (en prenant pour le moment, le cas trivial).
    Sinon en effet la RFC ne donne pas plus d'explications que ça sur ce sujet (et sur pas mal d'autres au passage, mais qu'importe).

    Merci encore à tous, je vous tiens au courant.

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @gangsoleil : sous Windows, tu peux écrire un fichier alors que quelqu'un l'a déjà ouvert en écriture. Il me semblait que non justement :s
    Oui, j'ai fait le texte avec notepad ou wordpad, je ne sais plus : le dernier qui ecrit a raison.
    Par contre, avec deux instances de gvim, l'editeur te previent que ce meme fichier est deja ouvert.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    J'ai finalement opté pour une table de hachage.
    Les accès à la table sont synchronisés à l'aide d'un sémaphore et pour chaque nom de fichier, je retiens s'il est ouvert en lecture ou en écriture. Après chaque requête, on enlève le fichier de la table.

    Au final, si le fichier est ouvert en lecture et que la requête est un paquet de demande en lecture, ok, sinon, envoie d'une erreur (ACCESS_DENIED).
    Sinon si le fichier est ouvert en écriture, on ne peut rien garantir ainsi il y a envoi systématique d'une erreur (toujours la même).

    Voilà, je dois avouer que l'idée des fichiers temporaires me plaît assez alors je vais voir si c'est applicable sans trop de complications.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 21
    Points : 25
    Points
    25
    Par défaut
    Me suis rabattu sur des threads avec un pthread_mutex_t pour la synchronisation.

    Encore merci pour toutes vos idées, c'était vraiment intéressant.

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Visual basic - Tester si un fichier est ouvert
    Par juliep dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/03/2015, 19h19
  2. Réponses: 6
    Dernier message: 07/07/2014, 12h13
  3. [VBS] Tester si un fichier est ouvert(utilisé)
    Par l_autodidacte dans le forum Vos Contributions VBScript
    Réponses: 0
    Dernier message: 06/04/2014, 17h23
  4. Tester si 1 fichier est ouvert
    Par Jeanvaljean44 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 14/08/2008, 09h43
  5. Comment tester si fichier est ouvert ?
    Par fusef dans le forum Langage
    Réponses: 7
    Dernier message: 11/08/2004, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo