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

Langage Delphi Discussion :

Problème de droit d'accès à mes propres fichiers


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut Problème de droit d'accès à mes propres fichiers
    Bonjour,

    J'étais sous W10 et je suis en train de passer sous W11.
    J'utilise Delphi 6 Personal Edition.

    Actuellement, j'essaie d'utiliser "My Little Base" pour gérer un petit système de bases de données utilisant un fichier CSV.
    Je l'ai téléchargé ici: http://mylittlebase.free.fr/
    Mais c'est disponible ) de multiples endroits.

    Le programme de démo fonctionne bien.

    J'ai donc commencé à créer un premier programme à titre d'essai.
    Il s'agit d'un fichier de contacts simpliste, juste pour explorer les concepts.
    Je peux créer une nouvelle base (sauvegardé dans un fichier CSV) avec 3 enregistrements, lors du démarrage initial du programme.
    Lors du démarrage suivant, le programme est supposé réouvrir et charger la base existante.

    Et là, patatras, j'ai une erreur de droit d'accès en ouverture, sur mon propre fichier, créé par mon propre programme !

    Je suis dans un compte Admin, et j'exécute mon programme avec les privilèges Admin.
    J'ai vérifié: j'ai tous les droits d'accès sur le fichier:
    Nom : aa1.png
Affichages : 86
Taille : 33,3 Ko

    Voici le fichier créé lors du premier passage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nom;Prenom;Tel 1;Tel 2;Mail 1;Mail 2
    Dupont;;0601328562;0125688500;jacques.dupont@orange.fr;jdupont32@gmail.com
    Dupont;;0154896524;0756892545;annemarie.dupont@orange.fr;
    Martinet;;;;paul.martinett@laposte.fr;
    Et lors de la réouverture du fichier au deuxième passage, il y a une erreur IoResult=3 lors de la commande Reset après Assign du fichier.
    Cela de passe dans la fonction TMlb2.LoadFromCSVFile contenue dans l'unité mlb2.pas:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    function TMlb2.LoadFromCSVFile(filename1: string): Boolean;
    var F: TextFile;
        fline, token: string;
        is_first_line: boolean;
        i, k: LongInt;
    begin
         init_error;
    showmessage('mlb2.LoadFromCSVFile a '+filename1);
         AssignFile(F, filename1);
    showmessage('mlb2.LoadFromCSVFile b');
         {$i-}
            Reset(F);
         {$i+}
    showmessage('mlb2.LoadFromCSVFile c');
         If (Trim(filename1)='') or (IoResult<>0) then begin
            {CloseFile(F);}
            MLBError := MLB_ERROR_IO;     // <======== ici, "Accès au fichier refusé" dans commande Reset !!!!!!!!!
            MLBErrorComment := '1-Unable to open the file for reading';
            Result := False;
            Exit;
         end else begin
             nameFromFilename(filename1);
             Result := True;
             Init;
             is_first_line := True;
             While Not Eof(F) Do begin
                   ReadLn(F, fline);
                   if (not is_first_line) and (Trim(fline)<>'') then begin
                      AddRow;
                   end else begin
                   end;
                   i := 1;
                   k := 0;
                   token := '';
                   while (i<=length(fline)) do begin
                         if (fline[i] = '\') then begin
                            if (i<length(fline)) then begin
                                if (UpperCase(fline[i+1])='N') then begin
                                   token := token + #13 + #10;
                                end else begin
                                   token := token + fline[i+1];
                                end;
                                Inc(i, 1);
                            end else begin
                                token := token + fline[i];
                            end;
                         end else if (fline[i]=CSVSeparator) then begin
                              if is_first_line then begin
                                 AddField(token);
                              end else begin
                                 lastrow.Strings[k] := token;
                              end;
                              Inc(k, 1);
                              token := '';
                         end else begin
                              token := token + fline[i];
                         end;
                         Inc(i, 1);
                   end;
                   if is_first_line then begin
                     AddField(token);
                   end else begin
                     lastrow.Strings[k] := token;
                   end;
                   is_first_line := False;
             end;
             CloseFile(F);
         end;
    end;
    (j'ai mis quelques ShowMessage pour localiser le problème, et j'ai testé la valeur de IoResult par le debuggeur).

    Je n'arrive pas à comprendre pourquoi je n'arrive pas à ouvrir mon propre fichier, alors que le programme
    Voici ma procédure de TForm1.FormCreate qui fait le travail:
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ContactFile := Extractfilepath(ParamStr(0))+'Contacts.csv';
      modified := false; 
        Contacts.Init;
        Contacts.AddField('Nom');
        Contacts.AddField('Prenom');
        Contacts.AddField('Tel 1');
        Contacts.AddField('Tel 2');
        Contacts.AddField('Mail 1');
        Contacts.AddField('Mail 2');
     
        Contacts.AddRow;
        Contacts.SetData('Nom','Dupont');
        Contacts.SetData('Prénom','Jacques');
        Contacts.SetData('Tel 1','0601328562');
        Contacts.SetData('Tel 2','0125688500');
        Contacts.SetData('Mail 1','jacques.dupont@orange.fr');
        Contacts.SetData('Mail 2','jdupont32@gmail.com');
     
        Contacts.AddRow;
        Contacts.SetData('Nom','Dupont');
        Contacts.SetData('Prénom','Annemarie');
        Contacts.SetData('Tel 1','0154896524');
        Contacts.SetData('Tel 2','0756892545');
        Contacts.SetData('Mail 1','annemarie.dupont@orange.fr');
        Contacts.SetData('Mail 2','');
     
        Contacts.AddRow;
        Contacts.SetData('Nom','Martinet');
        Contacts.SetData('Prénom','Paul');
        Contacts.SetData('Tel 1','');
        Contacts.SetData('Tel 2','');
        Contacts.SetData('Mail 1','paul.martinett@laposte.fr');
        Contacts.SetData('Mail 2','');
     
        modified := true;
        showmessage('fichier a été créé');
      end else begin
        if  Contacts.LoadFromCSVFile(ContactFile) then showmessage('fichier a été chargé')
                                                  else showmessage('Load error '+inttostr(Contacts.MLBError)+'  '+Contacts.MLBErrorComment);
      end;
     
      if not Contacts.GoFirst then showmessage('error GoFirst');
      showmessage(Contacts.GetData('Nom'));
      Form1.Caption := 'Contacts - '+ContactFile;
      if modified then Form1.Caption := 'Contacts - '+ContactFile + ' ' + '*  (' + inttostr(Contacts.RowCount) + ' contacts)'
                  else Form1.Caption := 'Contacts - '+ContactFile + '  (' + inttostr(Contacts.RowCount) + ' contacts)';
    end;
    Là encore, quelques ShowMessage pour suivre à la trace...

    Le projet complet est dans un fichier ZIP en pièce jointe.

    Je n'avais pas encore rencontré ce genre de problème de droit d'accès tant que j'étais sous W10.
    Qu'est-ce que j'ai manqué ?
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 464
    Par défaut
    Le problème n’est pas lié à Delphi 6 ni à « My Little Base » en lui-même, mais à la protection stricte du répertoire d’installation sous Windows 11. Déplacez votre fichier CSV dans un dossier utilisateur (AppData, Documents ou ProgramData)

    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
    uses
      ShlObj, Windows, SysUtils;
     
    function GetLocalAppData: string;
    var
      Path: array[0..MAX_PATH] of Char;
    begin
      // CSIDL_LOCAL_APPDATA pointe vers C:\Users\<User>\AppData\Local
      if SHGetFolderPath(0, CSIDL_LOCAL_APPDATA or CSIDL_FLAG_CREATE,
                         0, 0, Path) = S_OK then
        Result := IncludeTrailingPathDelimiter(Path)
      else
        // En dernier recours, dossier de l’exe
        Result := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)));
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup !

    Fichue protection... Mais voici où j'en suis dans mes recherches:

    1. Le code que tu me proposes, pointe vers un dossier dans lequel je devrais créer un sous-dossier par application si je veux maintenir un peu d'ordre dans les fichiers.
    et en cas d'anomalie, ta fonction renvoie vers le dossier dans lequel s'exécute le fjchier EXE généré par Delphi, et c'est ce que je faisais...

    2. Bien que j'aie ajouté ShlObj dans les Uses, la fonction SHGetFolderPath reste inconnue. D'après ce que j'ai trouvé sur internet, elle serait remplacée par SHGetLnownFolderPath qui a bien plus de constantes identifiant des dossiers.

    3. Mais en réalité, je viens de découvrir que je me suis fait coincer par mon propre pare-feu/antivirus (Iobit MalwareFighter Pro).
    J'ai ajouté mon exe dans a liste blanche, et tout fonctionne comme par magie, avec le code d'origine.

    Bon, techniquement, mon problème est résolu. Je reste tout de même perplexe: je peux créer un fichier dans le dossier de mon exécutable (qui se trouve dans u dossier de l'aborescence ...\Docments\... de mon utilisateur admin), mais ensuite, je ne peux pas r=le réouvrir. Fichu pare-feu... Je vais signaler cela à Iobit !

    Merci en tout cas de m'avoir mis sur la piste !

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 464
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    Merci beaucoup !

    Fichue protection... Mais voici où j'en suis dans mes recherches:

    1. Le code que tu me proposes, pointe vers un dossier dans lequel je devrais créer un sous-dossier par application si je veux maintenir un peu d'ordre dans les fichiers.
    et en cas d'anomalie, ta fonction renvoie vers le dossier dans lequel s'exécute le fjchier EXE généré par Delphi, et c'est ce que je faisais...

    2. Bien que j'aie ajouté ShlObj dans les Uses, la fonction SHGetFolderPath reste inconnue. D'après ce que j'ai trouvé sur internet, elle serait remplacée par SHGetLnownFolderPath qui a bien plus de constantes identifiant des dossiers.

    3. Mais en réalité, je viens de découvrir que je me suis fait coincer par mon propre pare-feu/antivirus (Iobit MalwareFighter Pro).
    J'ai ajouté mon exe dans a liste blanche, et tout fonctionne comme par magie, avec le code d'origine.

    Bon, techniquement, mon problème est résolu. Je reste tout de même perplexe: je peux créer un fichier dans le dossier de mon exécutable (qui se trouve dans u dossier de l'aborescence ...\Docments\... de mon utilisateur admin), mais ensuite, je ne peux pas r=le réouvrir. Fichu pare-feu... Je vais signaler cela à Iobit !

    Merci en tout cas de m'avoir mis sur la piste !
    En effet, ton souci est dû à Iobit MalwareFighter. J'ai testé ton setup sur mon Windows 11 : le fichier csv se crée sans difficulté, ainsi que la lecteur du fichier.

    Cependant, je ne dispose d'aucun antivirus sur mon ordinateur. Pour ma part, cela ne présente aucun intérêt, sauf pour ralentir mon ordinateur

    Bien que j'aie ajouté ShlObj dans les Uses, la fonction SHGetFolderPath reste inconnue. D'après ce que j'ai trouvé sur internet, elle serait remplacée par SHGetLnownFolderPath qui a bien plus de constantes identifiant des dossiers.
    Delphi 6 ne la déclare pas, donc il faut la déclarer manuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    uses
      Windows, ShlObj;
     
    function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle;
      dwFlags: DWORD; pszPath: PWideChar): HRESULT; stdcall;
      external 'SHFolder.dll' name 'SHGetFolderPathW';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Path: array[0..MAX_PATH] of WideChar;
    begin
      if SHGetFolderPath(0, CSIDL_PERSONAL, 0, 0, @Path) = S_OK then
        ShowMessage(WideCharToString(Path));
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  5. #5
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 364
    Billets dans le blog
    1
    Par défaut
    Merci pour l'info concernant SHGetFolderPath !
    Très utile à savoir. Je vais le mettre dans ma collection d'astuces pour D6.

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

Discussions similaires

  1. [C#]droit d'accès d'un fichier
    Par bilb0t dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/09/2007, 10h19
  2. droits d'acces à un fichier
    Par pipip dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 13/01/2007, 01h59
  3. Réponses: 4
    Dernier message: 05/01/2007, 18h06
  4. [VB.net] donner droits d'acces sur des fichiers
    Par pikho dans le forum ASP.NET
    Réponses: 4
    Dernier message: 06/06/2006, 09h33
  5. Droits d'accès sur les fichiers
    Par billbocquet dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/01/2006, 11h24

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