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 :

readdir et fopen


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut readdir et fopen
    Bonjour,

    Mon but est de détecter la création d'un fichier dans un répertoire donné.
    Pour cela j'utilise la méthode suivante issue de la FAQ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <dirent.h>
     
    int main (void)
    {
       DIR * rep = opendir (".");
     
       if (rep != NULL)
       {
          struct dirent * ent;
     
          while ((ent = readdir (rep)) != NULL)
          {
              printf ("%s\n", ent->d_name);
          }
     
          closedir (rep);
       }
       return 0;
    }
    Cette méthode fonctionne très bien.

    Un autre programme crée dans ce répertoire surveillé avec la méthode fopen un fichier, y copie des informations, puis ferme le fichier.

    Donc la méthode ci-dessus peut s'apercevoir de la création du fichier avant que mon deuxième programme n'ai fini d'écrire dedans.

    D'après ce que j'avais compris, readdir n'intervient pas sur l'accés aux fichiers, il détecte juste leur présence.

    Donc en remplaçant le printf par un fopen et un test de du retour de fopen, je dois être en mesure de n'ouvrir le fichier que lorsque mon autre programme le ferme non ?

    Est ce que quelqu'un serait capable de me confirmer ces propos ?
    Je le remercie d'avance.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Donc en remplaçant le printf par un fopen et un test de du retour de fopen, je dois être en mesure de n'ouvrir le fichier que lorsque mon autre programme le ferme non ?
    Je crains que la réponse dépende du système d'exploitation. Sous Unix rien n'empèche en général d'avoir deux processus qui ont le même fichier ouvert en même temps.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Je crains que la réponse dépende du système d'exploitation. Sous Unix rien n'empèche en général d'avoir deux processus qui ont le même fichier ouvert en même temps.
    Sous Windows non plus. Tout dépend des privilèges de partage que tu demandes et des privilèges de partage accordés par le premier qui a ouvert le fichier.

    Quand je dis "privilèges de partage", cela n'a rien à voir avec netbios, c'est la faculté qu'ont 2 process à ouvrir un même fichier.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Sous Windows non plus. Tout dépend des privilèges de partage que tu demandes et des privilèges de partage accordés par le premier qui a ouvert le fichier.

    Quand je dis "privilèges de partage", cela n'a rien à voir avec netbios, c'est la faculté qu'ont 2 process à ouvrir un même fichier.
    Ha je ne savais pas pour windows, personnellement sous Windows XP avec le compte admin tous les fichiers que je crée ne peuvent être automatiquement lu que par un seul process à la fois. Ou bien c'est les méthodes de l'objet .Net File qui font des vérifications supplémentaires. Je crois que sous windows on peut obtenir comme info pour un fichier quel process est entrain de l'utiliser.

    Bon a par cela, personnellement je suis sous Fedora 7/8, cela dépend des machines.

    Merci en tout cas pour vos réponses.

    Normalement, la réponse à ma question devait me permettre de résoudre un bug, qui aurait put être la lecture d'un même fichier en même temps. Mais il s'est avéré que c'était autre. J'ai laissé le post quand même car je n'était pas sur de ce que je décrivais.

    Finalement, le meilleur moyen pour éviter que 2 processus utilise en même temps un même fichier, c'est d'utiliser des signaux que les processus émettent une fois leur tache fini. Il y a aussi les mutex, mais je ne sais pas si le C le permet, je vérifierais.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Sous Unix, tu as flock() et fcntl() qui sont destines a permettre aux programmes de gerer l'acces (mais il n'y a aucun effet contraignant, ca ne fonctionne que si les programmes collaborent).

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Sous Windows, tu as les "Change Notification", qui permettent de détecter qu'un fichier d'un répertoire a été modifié.
    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.

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

Discussions similaires

  1. Différence open et fopen
    Par SteelBox dans le forum C
    Réponses: 6
    Dernier message: 01/07/2003, 21h32
  2. fopen -> différences entres les types d'ouvertur
    Par Patrick PETIT dans le forum C
    Réponses: 10
    Dernier message: 01/06/2003, 18h19
  3. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  4. Ouvrir (fopen) un fichier caché
    Par shef dans le forum C
    Réponses: 2
    Dernier message: 09/09/2002, 09h06
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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