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 :

Fonction FileExists() KO sur Windows 7 64b


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut Fonction FileExists() KO sur Windows 7 64b
    Hello,

    Il vient de m'arriver une curiosité avec la fonction "FileExists".

    Mon programme tourne parfaitement avec cette fonction sur les OS XP,Vista 32 et 64b et sur Windows 7 32b.

    Par contre il se passe une chose curieuse sur un OS Windows 7 64b.

    En effet alors même que les lignes suivantes sont OK :
    if FileExists('c:\windows\essai.sys'); ---> fichier trouvé
    if FileExists('c:\windows\system32\essai.sys'); ---> fichier trouvé

    J'obtiens ceci pour le dossier "drivers":
    if FileExists('c:\windows\system32\drivers\essai.sys'); ---> fichier non trouvé.

    j'ai les droits "administrateur" sur ce dossier, l'UAC est désactivée, je n'ai aucun problème avec l'explorateur Windows pour supprimer, renommer ou créer un fichier sous "drivers".

    Auriez-vous une idée car je tourne en rond sans trouver l'explication, j'ai même utilisé SetACL pour donner les droits "full sur le dossier mais sans succès.

    Merci pour vos réponses.

    A bientôt...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 579
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 579
    Par défaut
    @ Nicolas Coolman, et avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FileExists('%windir%\system32\drivers\essai.sys') then....;

    J'ai oublié de précisé que Seven 64 Bits a aussi ce dossier "sysWOW64" qui est identique au dossier "system32".

    Certains jeux y copies aussi des fichiers.

    Vérifie ou se trouve ce dossier et essaye alors ton code, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FileExists('%windir%\sysWOW64\drivers\essai.sys') then....;

    Voici un lien interessant ! :

    http://support.microsoft.com/kb/282945

    @+,

    Cincap

  3. #3
    Membre confirmé Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Re,

    Merci pour ta réponse,

    La syntaxe que j'utilise est bien celle que tu indiques, d'ailleurs cela fonctionne pour des fichiers sous "Windows" et "Windows\system32". Pour ce qui est de SysWOW64, je n'ai pas de difficulté, la fonction de recherche fonctionne parfaitement dans ce dossier.

    Le seul cas où cela ne fonctionne pas c'est pour le dossier "Windows\system32\drivers" qui est bien présent sur ma station 64b.

    J'indique aussi que j'ai l'affichage des dossiers systèmes cachés et que le ou les fichiers que je souhaite rechercher sont biens présents et visibles.

    A+

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 579
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 579
    Par défaut
    @ Nicolas Coolman, on pourrait penser que "FileExists" n'est pas accessible pour une arborescence de plus de 2 dossiers !

    Peut être faire l'essai avec une variable genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Var
    DirBuf : array [0..255] of char;

    @+,

    Cincap

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 128
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 128
    Par défaut
    Salut.

    FileExists dans mon vieux SysUtils.pas utilise FileAge :
    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
    function FileAge(const FileName: string): Integer;
    var
      Handle: THandle;
      FindData: TWin32FindData;
      LocalFileTime: TFileTime;
    begin
      Handle := FindFirstFile(PChar(FileName), FindData);
      if Handle <> INVALID_HANDLE_VALUE then
      begin
        Windows.FindClose(Handle);
        if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
        begin
          FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
          if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
            LongRec(Result).Lo) then Exit;
        end;
      end;
      Result := -1;
    end;
     
    function FileExists(const FileName: string): Boolean;
    begin
      Result := FileAge(FileName) <> -1;
    end;
    et mon SDK me dit, à propos de FILE_ATTRIBUTE_DIRECTORY,
    The handle identifies a directory.
    Faudrait peut-être chercher du côté de FILE_ATTRIBUTE_SYSTEM ?
    The file or directory is part of the operating system, or is used exclusively by the operating system.
    Quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if (FindData.dwFileAttributes {and FILE_ATTRIBUTE_DIRECTORY} and FILE_ATTRIBUTE_SYSTEM) = 0 then
    Rien testé, juste une idée tardive comme ça, mais si j'avais une machine 7-64, c'est ce que je testerais en premier.
    Et penser à jouer avec le "or", on ne sait jamais.

    edit
    Ce qui m'a fait penser à ça, c'est le lien de cincap, mais en anglais c'est plus clair,
    To resolve this issue, when you initiate a search, click Search Options, click Advanced Options and then click Search System Folders. You can then search the system folders for all files.

  6. #6
    Membre confirmé Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Par défaut
    Bonsoir,

    Merci pour vos suggestions, je vais étudier cela et je vous tiens au courant.

    Bonne nuit.

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

Discussions similaires

  1. Pb installation Oracle 11g sur windows 7 64b
    Par Korfandar dans le forum Installation
    Réponses: 1
    Dernier message: 28/05/2010, 11h33
  2. Fonction RSA_print_fp crash sur Windows
    Par bkadoum dans le forum C
    Réponses: 3
    Dernier message: 29/01/2009, 11h58
  3. Réponses: 23
    Dernier message: 27/10/2006, 11h08
  4. Probleme avec IFRAME et fonction sur window.parent
    Par FadeOut dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/10/2006, 09h31
  5. Où trouver l'aide sur les fonctions de l'API Windows ?
    Par psidonio dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 08/11/2005, 14h28

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