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 :

pourquoi le chemin n'est pas pris en compte


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut pourquoi le chemin n'est pas pris en compte
    Bonjour

    Je tente de gérer un fichier INI pour enregistrer quelques paramètres de mon application (tailel fenetre, sa position etc....)
    J'ai mis en place la classe trouvée ici
    http://www.codeproject.com/Articles/...-class-using-C
    dont voici le code
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    using System;
    using System.Runtime.InteropServices;
    using System.Text;
     
    namespace Ini
    {
        /// <summary>
        /// Create a New INI file to store or load data
        /// </summary>
        public class IniFile
        {
            public string path;
     
            [DllImport("kernel32")]
            private static extern long WritePrivateProfileString(string section,
                string key,string val,string filePath);
            [DllImport("kernel32")]
            private static extern int GetPrivateProfileString(string section,
                     string key,string def, StringBuilder retVal,
                int size,string filePath);
     
            /// <summary>
            /// INIFile Constructor.
            /// </summary>
            /// <PARAM name="INIPath"></PARAM>
            public IniFile(string INIPath)
            {
                path = INIPath;
            }
            /// <summary>
            /// Write Data to the INI File
            /// </summary>
            /// <PARAM name="Section"></PARAM>
            /// Section name
            /// <PARAM name="Key"></PARAM>
            /// Key Name
            /// <PARAM name="Value"></PARAM>
            /// Value Name
            public void IniWriteValue(string Section,string Key,string Value)
            {
                WritePrivateProfileString(Section,Key,Value,this.path);
            }
     
            /// <summary>
            /// Read Data Value From the Ini File
            /// </summary>
            /// <PARAM name="Section"></PARAM>
            /// <PARAM name="Key"></PARAM>
            /// <PARAM name="Path"></PARAM>
            /// <returns></returns>
            public string IniReadValue(string Section,string Key)
            {
                StringBuilder temp = new StringBuilder(255);
                int i = GetPrivateProfileString(Section,Key,"",temp, 
                                                255, this.path);
                return temp.ToString();
     
            }
        }
    }
    Elle fonctionne trés bien, le INI est créé, avec les valeurs que je veux et tout et tout mais si je crée un objet en spécifiant ainsi le chemin du fichier ini souhaité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string filename = "toto.ini";
                IniFile ini = new IniFile(filename);
    Le fichier est créé dans C:\Users\moi\AppData\Local\VirtualStore\Windows

    si je crée l'object en spécifiant ainsi le chemin du fichier ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                string filename = "c:\toto.ini";
                IniFile ini = new IniFile(filename);
    Cela va toujours au même endroit C:\Users\moi\AppData\Local\VirtualStore\Windows

    Quoi que je mette comme chemin ca me crée toujours le fichier ini dans ce répertoire

    pourquoi ? Comment créer le fichier ini là où je le souhaite (là où se trouve l'exécutable)

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par petitours Voir le message
    Cela va toujours au même endroit C:\Users\moi\AppData\Local\VirtualStore\Windows

    pourquoi ? Comment créer le fichier ini là où je le souhaite (là où se trouve l'exécutable)
    C'est tout à fait normal. Tu essayes d'écrire dans un dossier où tu n'a pas les droits d'écriture du fait Windows virtualise et stocke ton fichier à un endroit où tu as les droits d'écriture.

    Si tu ne veux pas avoir de problème tu stockes le fichier dans APPDATA ou tu donnes les droits administrateurs à ton programme.

  3. #3
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Bonjour

    et ben si tous les trucs que l'on trouve dans ce répertoire virtalStore sont le fruit de développeurs qui n'ont pas posés de question sur développez.com, ca en fait !...


    En fouinant un peu j'ai cru comprendre que le mieux était d'utiliser cette commande pour accéder à appData
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "tatuti.ini");
    Ca marche bien mais ca ne mets pas à la racine de appData mais dans le repertoire "roaming".

    C'est ça le répertoire utilisateur pointé par Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData ? ou c'est encore Windows qui fait le grand écart pour me mettre mon fichier là où il veut ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  4. #4
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Salut,

    Quand tu écrit un chemin le \ risque de te posé problème car la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string filename = "c:\toto.ini";
    de mémoire il te fait une tabulation dans ta chaine de caractère.
    Soit tu mets donc un autre caractère d’échappement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string filename = "c:\\toto.ini";
    Soit tu mets un @ devant pour spécifier que c'est un chemin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     string filename = @"c:\toto.ini";
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour MarieKisSlaJoue

    As-tu essaye plutot:LocalApplicationData...
    voici ce qu'en dit la msdn doc:

    ApplicationData:

    The directory that serves as a common repository for application-specific data for the current roaming user.
    A roaming user works on more than one computer on a network.
    et
    LocalApplicationData:
    The directory that serves as a common repository for application-specific data that is used by the current, non-roaming user.
    lien msdn:
    http://msdn.microsoft.com/en-us/libr...olderpath.aspx

    bon code...........

  6. #6
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Merci, je crois que j'ai pigé

    Mais du coup je fais un écart sur un autre soucis que ceci me soulève :
    J'avais compris qu'avec la couche intermédiaire formée par le framework, une appli .NET pouvait être distribuée sur n'importe quelle plateforme, du moment qu'il y avait un framework pour cette plateforme.
    Mais ce que nous venons de voir sur les répertoires users est une subtilité de Windows, windows 7 même si je ne m'abuse... Du coup, comment ca se passe pour la portabilité de l'appli, sur un windows plus ancien (XP par exemple) ou sur un mac, linus ou que sais je ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Points : 136
    Points
    136
    Par défaut
    Pour les chemins, les OS Windows savent indiquer à ton application où se trouvent leur dossier

    Pas de Framework .Net sur Mac/Linux .. Il faut alors passer par une machine virtuelle pour pouvoir y faire tourner l'application.

    Il y a un projet Mono pour Linux qui permettait d'exécuter des appli .Net sur Linux fut un temps .. Mais j'ai aucune idée de ce que c'est devenu

  8. #8
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    donc si je comprends bien je me suis complètement craqué en comprenant qu'une appli .NET peut être déployée sur un peu n'importe quoi ?.rotte !

    Du coup j'ai l'inconvénient de la lourdeur du framework sans le principal avantage que je lui voyait
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  9. #9
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

    Informations professionnelles :
    Activité : Ingénieur Cloud
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Si tu veux du multi plateforme java ressemble pas mal à C#, mais en effet les techno windows reste sur windows, enfin je te rassure ça te laisse encore un public très très large.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2008
    Messages : 97
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par MarieKisSlaJoue Voir le message
    Si tu veux du multi plateforme java ressemble pas mal à C#, mais en effet les techno windows reste sur windows, enfin je te rassure ça te laisse encore un public très très large.
    Avec java il faut le JRE autant que C# à besoin du framework ou Mono pour linux

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Je tente de gérer un fichier INI pour enregistrer quelques paramètres de mon application (tailel fenetre, sa position etc....)
    Pour sauver les préférences de son application, aucun besoin de gérer manuellement des fichiers ini. VS construit automatiquement un fichier des settings, suffit de lui dire (propriétés du projet -> settings) et d'y placer directement les valeurs. Rien du tout à gérer, on ne sait pas faire plus simple et il n'y a aucun problème d'accès. Le temps des ini pour ce genre de choses, c'est un peu dépassé.

    J'avais compris qu'avec la couche intermédiaire formée par le framework, une appli .NET pouvait être distribuée sur n'importe quelle plateforme, du moment qu'il y avait un framework pour cette plateforme.
    C'est le cas.

    Mais ce que nous venons de voir sur les répertoires users est une subtilité de Windows, windows 7 même si je ne m'abuse... Du coup, comment ca se passe pour la portabilité de l'appli, sur un windows plus ancien (XP par exemple) ou sur un mac, linus ou que sais je ?
    Il ne faut pas coder "en dur" les séparateurs, répertoires système etc.
    Le framework founit des variables et constantes qui permettent de tenir compte de l'environnement.

    Ainsi, plutôt que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var file = "MonRepertoireApplicatif\\monfichier"
    mieux vaut un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var file = AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar.ToString() + "Monfichier"
    Ainsi, on obtient du code beaucoup plus indépendant du contexte.
    C'est vrai que les exemples trouvés concernent souvent des "cas particuliers" et ne fonctionnent parfois que dans un cas d'environnement précis.
    Mais ce n'est pas la faute du framework, c'est la faute du programmeur

    Pas de Framework .Net sur Mac/Linux .. Il faut alors passer par une machine virtuelle pour pouvoir y faire tourner l'application.
    Il y a mono, qui suit pas mal les nouveautés du framework.
    Donc C# est aussi portable que Java, les deux nécessitent un compilateur jit sur la machine cible et le même genre de ressources. En dotnet on a cependant pas mal d'avantages sur Java, dont Linq (mais bon, là ce n'est que mon avis subjectif).

    A+
    Claude

  12. #12
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par ClaudeBg Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var file = AppDomain.CurrentDomain.BaseDirectory + Path.DirectorySeparatorChar.ToString() + "Monfichier"
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Monfichier")

  13. #13
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Bonjour

    Je reviens un peu tardivement après une méga crève, un rattrapage de retard et quelques essais...

    J'ai réussi à faire fonctionner comme je veux mon fichier INI mais comme le suggère claudeBg je tente d'utiliser le fichier de settings de .NET afin de ne pas faire une chose dépassée, tant qu'à faire :-)

    Dans les propriété de mon projet j'ai bien trouvé une rubrique paramètres où je peux définir ce qui ressemble à une liste de paramètre avec un format et une valeur.
    Mais je n'arrive pas à trouver comment manipuler ces valeurs ensuite, ça doit être trop simple...

    Par exemple, si je veux stocker la position de la fenêtre principale à la fermeture et la réutiliser à l'ouverture, comment fait on pour accéder à un sttings "positionFenetre" ? (ou deux paramètres...)

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Salut
    -----

    Dans les propriété de mon projet j'ai bien trouvé une rubrique paramètres où je peux définir ce qui ressemble à une liste de paramètre avec un format et une valeur.
    Mais je n'arrive pas à trouver comment manipuler ces valeurs ensuite, ça doit être trop simple...
    On y accède par Properties.Settings.Default;

    Pour ma part, pour éviter de me trainer ça dans mon code, j'ajoute une variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     private Properties.Settings Prefs = Properties.Settings.Default;        // raccourci sur settings
    Ensuite, pour accéder à une propriété, on fait Prefs.maPropriété

    Pour modifier, on affecte, et pour valider les modifs on utilise Prefs.Save();

    Par exemple, si je veux stocker la position de la fenêtre principale à la fermeture et la réutiliser à l'ouverture, comment fait on pour accéder à un sttings "positionFenetre" ? (ou deux paramètres...)
    Moi, je fais comme ceci dans le form_Load :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //----------------------------------------------------------------------------------------
                //                                TAILLE ET POSITION DE LA FENÊTRE
                //----------------------------------------------------------------------------------------
                if (Prefs.formWidth != 0)
                {
                    this.Width = Prefs.formWidth;
                    this.Height = Prefs.formHeight;
                    this.Top = Prefs.formTop;
                    this.Left = Prefs.formLeft;
                }
                this.WindowState = Prefs.formState;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     this.Size = Prefs.formSize;
      this.Location = Prefs.formLocation;

    Dans le fichier settings je mets les valeurs à 0.
    Ainsi, je ne restaure dimension et position que si j'ai déjà ouvert la fenêtre une fois (!= 0).

    Évidemment, je sauve dans le form_closing :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                // Mémoriser caractéristiques de la fenêtre principale
                Prefs.formState = this.WindowState;                         // mémoriser état de la fenêtre
                if (this.WindowState == FormWindowState.Normal)             // tailles et positions n'ont de sens que si la fenêtre est ouverte normalement
                {
                    Prefs.formHeight = this.Height;
                    Prefs.formWidth = this.Width;
                    Prefs.formTop = this.Top;
                    Prefs.formLeft = this.Left;
                }
                Prefs.Save();                                               // sauver les préférences

    A+
    Claude

  15. #15
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 937
    Points : 2 018
    Points
    2 018
    Par défaut
    Merci beaucoup

    ça commence à rentrer...
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/08/2006, 11h00
  2. Problème avec un div qui n'est pas pris en compte
    Par boss_gama dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 25/07/2006, 16h32
  3. Réponses: 5
    Dernier message: 01/07/2006, 12h52
  4. Mon script cron n'est pas pris en compte
    Par tomnie dans le forum Linux
    Réponses: 11
    Dernier message: 31/03/2004, 11h19

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