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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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".
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  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
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    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
    Membre averti
    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
    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.

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    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
    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.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

+ 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