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 :

problème d'acces à un répertoire sur un serveur


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut problème d'acces à un répertoire sur un serveur
    Bonjour à tous,
    j'essaye d'écrire une fonction permettant d'ouvrir un répertoire situé en local ou sur un serveur (juste l'ouvrir, pas d'écriture, ni de modifications, etc...).
    Le code compile sans problème, j'arrive à lancer l'exécutable, etc...

    Cependant, lors de l'exécution pour le répertoire sur serveur, la console me marque qu'elle n'arrive pas à ouvrir un chemin de style "\\mon_serveur\Seinen\mon_projet".
    De fait, elle se rabat sur le directoire par défaut qui est "C:\Windows".

    J'ai remarqué qu'en mappant le serveur comme suit "X:\Seinen\mon_projet", alors l'exécution fonctionne sans problème.
    Cependant, je dois garder la première notation. Ne trouvant pas de solution, je me tourne vers vous, en espérant que quelqu'un saura éclairer ma lanterne.

    Voici mon programme :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <direct.h>
     
     
    bool ouvrir_repertoire()
    {	
           bool flag=0;
     
    /* Répertoire que l'on veut ouvrir */
    	char directory[] = "\\\\mon_serveur\\Seinen\\mon_projet";
     
     
    /*Si le répertoire ne s'ouvre pas, on indique la cause de l'échec.*/            
    	if (_chdir (directory))									   
    		printf( "Opening Failure : %s\n\n", strerror( errno ) ); 
     
    /* Sinon, on indique qu'on a réussi, et on lève le flag*/
    	else
           {                                        
    	printf("Directory is open\n");
    	system( "dir *.txt");  
           flag=1;
           }
     
    /* Envoie de la valeur du flag.*/
           return flag;	
    }
    En vous remerciant pour vous être donné la peine de lire mon message.
    Seinen.

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Je ne sais pas si ça va t'aider, mais cette syntaxe marche bien chez moi avec un dossier sur le réseau.

    Es-tu sur d'avoir accès au dossier que tu recherches ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Merci d'avoir essayé.

    Niveau droits d'accès je ne devrais pas avoir de problème, vu que c'est moi qui ai créé le dossier et je n'ai pas changé de compte entre temps (de toute manière, j'en ai qu'un).

    Sinon, je vais réécrire le message que j'obtiens sur la console :

    '\\mon_server\Seinen\mon_projet'
    CMD.exe a été démarré avec le chemin d'accès comme répertoire en cours. Les chemins d'accès UNC ne sont pas pris en charge. Utilisation du répertoire Windows par défaut.
    Peut être que ceci parlera à quelqu'un.

  4. #4
    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 581
    Points
    41 581
    Par défaut
    En clair: Tu n'as pas le droit d'avoir un chemin réseau comme "répertoire courant" dans l'invite de commandes de Windows. Ça ne marche pas. Un point, c'est tout. Et ce, par soucis de compatibilité avec DOS.

    Par contre, tu peux passer le chemin en paramètre de dir...
    Code cmd : Sélectionner tout - Visualiser dans une fenêtre à part
    dir \\mon_server\Seinen\mon_projet\*.txt

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Médinoc
    Par contre, tu peux passer le chemin en paramètre de dir...
    Merci pour l'info.
    Cependant, je viens de trouver, sur le net, la fonction readdir(). Vaut-elle le coup (questions chemin d'accès, stabilité, sécurité,...) ?

  6. #6
    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 581
    Points
    41 581
    Par défaut
    opendir()/readdir()/closedir() valent le coup, mais ont l'inconvénient de ne pas être disponible "de base" sous Microsoft Visual Studio : En effet, ces fonctions ne sont pas standard C, mais POSIX, et Visual ne les propose pas. En revanche MinGW (dev-c++, code::blocks) les propose en tant qu'extension.

    Ces fonctions sont déclarées dans le fichier d'en-tête <dirent.h>

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ces fonctions sont déclarées dans le fichier d'en-tête <dirent.h>
    Y-a-t-il un moyen de récupérer cet en-tête quelque part, afin de l'ajouter dans le répertoire "include" de Microsoft Visual Studio ?

    Je viens d'essayer, mais apparemment ça ne marche pas. Soit l'en-tête que j'ai trouvé est corrompu, soit ce n'est tout simplement pas possible...

    Edit : Si oui, où puis-je le trouver ?

  8. #8
    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 581
    Points
    41 581
    Par défaut
    La déclaration d'une fonction ne suffit pas si tu n'as pas sa définition dans un code source ou une bibliothèque.

    Par contre, Google est ton ami.
    (dans le cas du lien que j'ai donné, la définition est inclue dans l'en-tête : Bien que ça paraisse pratique à utiliser, c'est considéré "de mauvais ton").

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Je te remercie pour le lien. Je vais essayer de suite ce que j'ai trouvé.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Bon, j'arrive à utiliser les fonctions opendir(), readdir() et closedir(). C'est très bien tout ça .
    Grâce à ces fonctions, j'arrive à taper un répertoire sur mon serveur, en passant par le chemin absolu .

    Cependant, encore un petit problème (et oui, encore et toujours des problèmes...) lorsque je met des droits d'écriture sur ce répertoire (refus de "lecture et exécution") ou que je le supprime, j'obtiens une fatal error du debuger et le programme plante.
    Alors que la fonction _chdir() me renvoyait un errno pour me décrire l'erreur ("Permission denied" ou "No such file or directory") et mon programme n'avait pas de problème.

    Quelqu'un saurait-il comment récupérer un errno (ou équivalant) avec opendir() et contourner la fatal error ?

    En gros voila le test que j'ai fait :

    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
    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
     
    int main(void)
    {
       struct dirent *lecture;
       DIR *rep;
       rep = opendir("\\\\mon_serveur\\Seinen\\mon_repertoire_supprime");
       while ((lecture = readdir(rep)))
       {
          printf("FICHIER: %s\n", lecture->d_name);
       }
       closedir(rep);
       return 0;
    }

  11. #11
    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 581
    Points
    41 581
    Par défaut
    Tu ne vérifies pas le retour de opendir()...

  12. #12
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Salut,

    si tu veux connaître l'erreur qu'y est renvoyée, tourne toi également vers errno.

    Voici un petit programme qui fonctionne bien :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <errno.h>
     
    extern int errno;
     
    int main(void)
    {
            struct dirent *lecture;
            DIR *rep;
            rep = opendir("\\\\mon_serveur\\Seinen\\mon_repertoire_supprime");
            if(rep == NULL)
            {
                    if(errno == ENOENT)
                            printf("Repertoire inexistant.\n");
                    if(errno == ENOTDIR)
                            printf("N'est pas un repertoire.\n");
                    // etc.
     
                   return EXIT_FAILURE;
            }
            while ((lecture = readdir(rep)))
            {
                    printf("FICHIER: %s\n", lecture->d_name);
            }
            closedir(rep);
            return EXIT_SUCCESS;
    }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./test
    Repertoire inexistant.
    Pour la liste des erreurs retournées par opendir : http://www.linux-kheops.com/doc/man/...opendir.3.html

    ++

  13. #13
    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 581
    Points
    41 581
    Par défaut
    Sauf qu'une fonction n'est pas censée régler errno si elle n'échoue pas, donc si errno n'est pas initialisée...

    Le vrai test, c'est vérifier si opendir() a retourné NULL ou non.

  14. #14
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Oui c'est vrai, j'ai oublié le test à NULL de rep, je corriges

    Après errno permet juste d'avoir l'erreur appropriée

  15. #15
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Merci les gars de vous donner la peine de m'aider.

    J'ai décortiqué l'erreur du debuger obtenue et apparemment celle-ci serait liée à mon fichier dirent.h
    A première vue, il n'aime pas cette ligne-ci (158ème ligne de mon fichier, se situant dans la fonction readdir(), si je me souviens bien) :
    Cependant, étant la première fois que j'utilise l'include <dirent.h>, j'ai un peu de mal à l'utiliser.

  16. #16
    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 581
    Points
    41 581
    Par défaut
    Cela confirme bien le problème: Tu as appelé readdir() alors que opendir() avait retourné NULL...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Points : 27
    Points
    27
    Par défaut
    Merci pour l'aide que vous m'avez fourni. J'ai réussi à mener à bien ce que je voulais faire avec mon répertoire.

    A bientôt.
    Seinen.

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

Discussions similaires

  1. Accès à un répertoire sur le serveur
    Par herodote92 dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 28/08/2009, 13h56
  2. Création répertoire sur un serveur
    Par foreal dans le forum Windows
    Réponses: 2
    Dernier message: 27/06/2006, 11h40
  3. Réponses: 3
    Dernier message: 26/04/2006, 21h45
  4. problème d'accès aux données sur serveur par poste client
    Par rahan_dave dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/02/2006, 09h13
  5. Création d'un répertoire sur un serveur
    Par Ric_ dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2005, 23h33

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