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

Delphi Discussion :

FileGetAttr ne marche pas pour les dossiers ?


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut FileGetAttr ne marche pas pour les dossiers ?
    Bonjour tout le monde, je désire savoir si un dossier est en lecture seule ou non, j'essaie le QR de la FAQ : http://delphi.developpez.com/faq/?pa...tributsfichier
    mais il n'indique jamais le dossier en ReadOnly.
    Pour info, je dossier est sur un serveur et partagé en lecture seule pour les tests.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      Attributs : Integer;  Attributs := FileGetAttr( edDossierSauvegarde.Text );
    begin
      if Attributs and faReadOnly = faReadOnly then
        ShowMessage( 'ReadOnly' );
    J'ai aussi essayé en utilisant un TSearchRec et FindFirst, FindNext, FindClose, j'ai eu le même problème, il ne le retrouvait pas étant en lecture seule.

    Est-ce que cela ne fonctionne que pour les fichiers ? Et si c'est le cas, comment peut-on le faire pour les dossiers ?
    Merci.

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Bonjour.

    Il est bien possible que la fonction FileGetAttr ne renvoit pas les informations d'un fichier caché. C'est l'encapsulation d'une API WINDOWS. par contre, aucun souci avec FindFisrt et FindNext. Je les utilises dans un programme de copie de fichiers, et je n'ai aucun problème pour copier les fichiers et dossiers cachés, en lecture seule, system.

    Voici une routine que j'utilise dans 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    {------------------------------------------------------------------------}
    {        Recherche tous les répertoires dans un répertoire racine        }
    {------------------------------------------------------------------------}
    function ListerLesRepertoires(const ParentDirectory: string;
                                  DirectoryList : TStringList) : Integer;
    var
      Status, J : Integer;
      SearchRec : TSearchRec;
      Chemin    : String;
     
    begin
      Chemin:=ParentDirectory;
      If Chemin = '' Then
       begin
          Result:=0;
          Exit;
       end;
      J := 0;
      If Chemin[Length(Chemin)] <> '\' Then Chemin:=Chemin + '\';
      Result := 0;
      Status := FindFirst(SlashSep(ParentDirectory, '*.*'), faDirectory, SearchRec);
      try
        while Status = 0 do
        begin
          if (SearchRec.Attr and faDirectory = faDirectory) then
          begin
            if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
            begin
              DirectoryList.Add(Chemin + SearchRec.Name + '\');
              Inc(J);
            end;
          end;
          Status := FindNext(SearchRec);
        end;
      finally
        FindClose(SearchRec);
      end;
      Result := J;
    end;
    Tiens moi au courant. Merci.

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Dans ton exemple, tu ne testes pas si un répertoire est en lecture seule ou non.
    Pour savoir si ce qui est trouvé est un répertoire ou non, il n'y a pas de soucis, cela fonctionne bien chez moi aussi, mais il indique que le répertoire n'est pas en lecture seule alors qu'il est partagé en lecture seule.
    Le Info.Attr retourne 16 (juste faDirectory) et non pas 17 (faDirectory et faReadOnly).

  4. #4
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Excuse. J'avais pas compris.

    C'est vrai, je ne teste pas si le dossier ou le fichier est en lecture seule ou non, car je n'ai pas besoin de le savoir.

    Dès que j'aurais un moment, je me pencherais sur le problème. Ca m'intéresse.

    A+

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Si tu trouves pourquoi cela ne marche pas et/ou si tu trouves comment le faire marcher, je suis preneur.

  6. #6
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Bonjour,

    Tu as essayé avec l'API GetFileAttributesEx ?

    Elle a l'air plus performante et ils parlent des attributs d'un dossier..

    @++

  7. #7
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut.
    Non je n'ai pas encore essayé, mais malheureusement, je suis passé à autre chose. Je garde ton lien sous la main pour un moment où j'essaierai.

  8. #8
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 670
    Points : 7 040
    Points
    7 040
    Par défaut
    J'ai commencé a tester, mais ca ne marche pas bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if GetFileAttributesEx('E:\info', GetFileExInfoStandard, @Buf) then
       begin
          if Buf.dwFileAttributes and FILE_ATTRIBUTE_READONLY = FILE_ATTRIBUTE_READONLY then
    Pour un répertoire sur un CD, ça détecte la lecture seule.
    Mais pour un répertoire sur mon disque dur, ça ne détecte rien.

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    S'il faut, c'est l'API de Windows qui est buguée sur ce point là.

  10. #10
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    API WINDOWS bogué ??????? Non sans blague. Est ce possible ? Depuis WIN 2000 (NT5) il y a eu d'énormes progrès.

    Je n'ai pas encore eu le temps de travailler sur le sujet. Mais pour ce qui est du bogue WINDOWS, c'est bien possible. mais il doit bien y avoir un moyens puisque l'explorateur de WINDOWS peut donner le renseignement !!!

    Une chose est certaine (constat de professionnel), à part l'outil de restauration, XP n'a apporté que des problèmes. Reste à tester les fonctions sous plusieurs sytèmes d'exploitations. Dès que je peux, je m'y met.

    A+

  11. #11
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Citation Envoyé par Philippe Gormand
    XP n'a apporté que des problèmes
    Accroche-toi bien aux branches alors, Vista arrive

    Je ne crois pas au bug de l'API à ce niveau là. Par contre, il est possible que certains attributs soient spécifiques au NTFS. D'où l'utilisation de fonctions particulières. Il faut regarder les fonctions NtXXXXX, il y en a peut-être une qui traine et qui fait ce qu'il faut

    @++

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    J'ai testé ici et tout fonctionne avec win2k...

    Le problème semble venir de XP....

    Si je change le flag READONLY sur un repertoire avec l'explorateur de xp,
    mon programme ne détecte absolument rien ! ...

    si via le réseau, je change le même flag sur le même repertoire
    à partir de l'explorateur win2k,
    mon programme fonctionne à merveille !...et la détection du READONLY
    fonctionne avec les 3 façons suivantes..

    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
     
    const
    	FILE_LIST_DIRECTORY=1;
    function ReadDirectoryAttribute(DirPath:string):Cardinal;
    var
        hDirectoryFileHandle:HFILE;
        FileInfoStruc:TByHandleFileInformation;
    begin
        //
        //*** Get Directory Handle! ***
        hDirectoryFileHandle := CreateFile (
        						PChar(DirPath),
    						    FILE_LIST_DIRECTORY,
    					    	FILE_SHARE_READ + FILE_SHARE_WRITE + FILE_SHARE_DELETE,
    						    NIL,
    					    	OPEN_EXISTING,
                                FILE_FLAG_BACKUP_SEMANTICS+FILE_FLAG_OVERLAPPED+FILE_FLAG_NO_BUFFERING,
                                0);
        try
            GetFileInformationByHandle(hDirectoryFileHandle,FileInfoStruc);
            ReadDirectoryAttribute:=FileInfoStruc.dwFileAttributes;
        finally
            CloseHandle(hDirectoryFileHandle);
        end;
    end;
     
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
        FileAtt:Cardinal;
    begin
        //*** Avec API CreateFile() et GetFileInformationByHandle()
        FileAtt:=ReadDirectoryAttribute(txtDir.Text);
        if (FileAtt AND FILE_ATTRIBUTE_READONLY)= FILE_ATTRIBUTE_READONLY then
        begin
            RichEdit1.Text:='READ ONLY';
        end
        else
        begin
            RichEdit1.Text:='Not Read Only';
        end;
        RichEdit1.Lines.Add(IntToStr(FileAtt));
        //*** API GetFileAttributes
        FileAtt:=GetFileAttributes(PChar(txtDir.Text));
        if (FileAtt AND FILE_ATTRIBUTE_READONLY)= FILE_ATTRIBUTE_READONLY then
        begin
            RichEdit1.Lines.Add('READ ONLY');
        end
        else
        begin
            RichEdit1.Lines.Add('Not Read Only');
        end;
        RichEdit1.Lines.Add(IntToStr(FileAtt));
        //*** Fonction Delphi qui call API GetFileAttributes
        FileAtt:=FileGetAttr(txtDir.Text);
        if (FileAtt AND FILE_ATTRIBUTE_READONLY)= FILE_ATTRIBUTE_READONLY then
        begin
            RichEdit1.Lines.Add('READ ONLY');
        end
        else
        begin
            RichEdit1.Lines.Add('Not Read Only');
        end;
        RichEdit1.Lines.Add(IntToStr(FileAtt));
    end;
    quelqu'un a une idée?

  13. #13
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Eric Sigoillot a écrit :
    Citation:
    Philippe Gormand a écrit :
    XP n'a apporté que des problèmes

    Accroche-toi bien aux branches alors, Vista arrive

    Je ne crois pas au bug de l'API à ce niveau là. Par contre, il est possible que certains attributs soient spécifiques au NTFS. D'où l'utilisation de fonctions particulières. Il faut regarder les fonctions NtXXXXX, il y en a peut-être une qui traine et qui fait ce qu'il faut
    Navré de te condredire, mais des APIs bas niveaux étaient déja boggées avec NT4, j'en ai fait les frais.
    Où je travaille, nous avons des tas de problèmes pour faire fonctionner des applications qui fonctionnaient sans problème avec W2K et qui ne fonctionnent pas avec XP (des applications scientifiques pour la plupart). Cela change même selon les versions de XP et des patchs. Ce que nous avons constaté, les stratégies de sécurité apportés à XP n'apportent que des problèmes.
    Le problème de WebPac vient peut être de ces fameuses stratégies de sécurité. Il serait interessant de chercher de ce côté.

    A+.

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    J'viens de tester avec windows 2003 server...

    Même problème que xp ....

Discussions similaires

  1. Code ne fonctionne pas pour les sous dossiers
    Par archi57 dans le forum VBScript
    Réponses: 10
    Dernier message: 18/02/2012, 15h24
  2. Réponses: 6
    Dernier message: 07/09/2009, 11h42
  3. Réponses: 0
    Dernier message: 21/05/2008, 15h59
  4. Réponses: 9
    Dernier message: 25/04/2008, 21h21
  5. [CSS] Bug IE avec height ne marche pas avec les %
    Par El Riiico dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 23/06/2005, 17h11

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