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 :

Forcer l'effacement d'un fichier


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut Forcer l'effacement d'un fichier
    Bonsoir à toutes et à tous, avec cette fonction, je n'arrive pas à éffacer un fichier alors que manuellement c'est possible.

    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
     
    Function DelTree(DirName : string): Boolean;
    var
      SHFileOpStruct : TSHFileOpStruct;
      DirBuf : array [0..255] of char;
    begin
      try
       Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
       FillChar(DirBuf, Sizeof(DirBuf), 0 ) ;
       StrPCopy(DirBuf, DirName) ;
       with SHFileOpStruct do begin
        Wnd := 0;
        pFrom := @DirBuf;
        wFunc := FO_DELETE;
        //fFlags := FOF_ALLOWUNDO;   //Evite la poubelle
        fFlags := fFlags or FOF_NOCONFIRMATION;
        fFlags := fFlags or FOF_SILENT;
       end; 
        Result := (SHFileOperation(SHFileOpStruct) = 0) ;
       except
        Result := False;
      end;
    end;
    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.ResetClick(Sender: TObject);
    begin
    wd :=  Path[CSIDL_SYSTEM] ;    //GetWinFolder_V1($0025);
      Dossier := '\oobe\info\BACKGROUNDS';
      S := '\Backup' ;
     
    if FileExists(wd + Dossier + '\BackgroundDefault.Jpg') then
     
         DelTree(wd + Dossier + '\BackgroundDefault.Jpg') else
          showmessage('Le logon par défaut est ok');
    end;
    Merci de l'aide éventuelle,

    @+,

    Cincap

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrPCopy(DirBuf, DirName+#0) ;
    pFrom demande une chaine à double zéro terminal.

    Sinon, si tu veux supprimer un seul fichier : utilise DeleteFile.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Nono40, merci de ta réponse, je viens de tester tes suggestions, et cela ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    wd :=  Path[CSIDL_SYSTEM] ;    //GetWinFolder_V1($0025);
      Dossier := '\oobe\info\BACKGROUNDS';
      S := '\Backup' ;
     
      StatusBar1.SimpleText := ('wd + Dossier') ;
     
    if FileExists(wd + Dossier + '\BackgroundDefault.Jpg') then
    deletefile(wd + Dossier + '\BackgroundDefault.Jpg')  else
          showmessage('Le logon par défaut est ok');
    end;
    Etonnant, car le message du bon déroulement, s'affiche.

    Ce fichier et dossier sont sous Seven, l'application se lance avec les droits Administrateurs et manuellement, je sais renommer, copier et deleter.

    Avant de poster, j'avais déjà essayé un peu de tout.

    Peut être avec un renamefile puis delete ?

    Bonne fête des pères.

    @+,

    Cincap

  4. #4
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Salut,

    Ce fichier et dossier sont sous Seven, l'application se lance avec les droits Administrateurs et manuellement, je sais renommer, copier et deleter.
    Tu avais tenté de créer un dossier en environnement protégé...

    Là, tu tentes de le deler ; même punition

    Il existe deux sortes de "Droits Administrateurs" me semble t-il sous Vista/7.

    Heureusement que tout ça n'est pas aussi facile que sous XP et avant.

    Sinon la sécurité de l'OS n'aurait pas trop évolué.

    Cincap, je sais qu'en ton cas c'est pour ton appli de fonds d'écran, mais Seven ne sait pas que c'est toi

    Franchement de nos jours, aller bidouiller en environnement protégé du système n'est pas une bonne idée.

    @+

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Droïde Système7, Hello, tu as tout à fait raison, mais le Background de Seven n'est plus dans une dll mais bien dans un dossier.

    Ce que je ne comprends pas, c'est que je sais modifier l'image, je sais créer un new dossier dans le même répertoire avec ForceDirectories, copier l'image par défaut et par contre je ne sais pas la déleter par une procédure, d'ou ma question.

    @+,

    Cincap

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par cincap
    [...] je sais créer un new dossier dans le même répertoire avec ForceDirectories [...]
    Heuuu, je croyais que tu n'y étais pas arrivé :
    http://www.developpez.net/forums/d93...-sous-dossier/



    @+

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Droïde Système7, mais si, en accordant manuellement le droit Administrateur au dossier malgré le fichier Manifest.

    Je sais pertinemment que c'est l'UAC qui pose ses conditions et que le fichier à déleter est occupé puisque la session est créée.

    Il doit bien avoir une sollution, un Kill peut être ?

    @+,

    Cincap

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Avais-tu tenté sous DeleteFile(...) ?

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Droïde Système7, bien entendu voir mon post de 8H40.

    Pourtant en direct, je sais l'effacer et mon chemin semble correct ou peut être trop long !

    Je teste différente solution mais..............

    @+,

    Cincap

  10. #10
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Si tu tentes :

    1. pointer cette commande d'un environnement libre (hors P.F., etc.)
    2. tester avec le chemin en dur
    3. tester avec : DeleteFile(PChar(wd + Dossier + '\Back...


    Je me souviens (que je ne me souviens plus...), l'autre fois, en effet j'avais mis des heures à trouver un truc tout bête qui m'empêchait de supprimer un fichier ; suite à une condition particulière.

    @+

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Droïde Système7, j'ai testé ta sugestion malgré que je l'avais déjà fait dans mes nombreux tests.

    1) En dur directement dans le dossier "Backgrounds" ou se trouve le fichier "BackgroundDefault.jpg",un click droit, menu, supprimer, cela fonctionne sans contrainte.

    Toujours en dur, touche delete sur le fichier, c'est ok.

    Conclusion, même si ce fichier est utilisé par le logon, on peut l'éffacer.

    2) Avec l'application de test (qui a les droits) directement dans le dossier "Backgrounds" et en utilisant diverses fonctions, le fichier ne s'éfface pas.

    J'ai aussi testé le chemin et niet.

    Peut-être reproduire le click de la touche delete ?

    @+,

    Cincap

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    avez vous tentez de modifier le Privilège du processus par SeRestorePrivilege

    A+

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Fbalien, salut comment l'adapter et pourquoi, je perd apparemment le droit Administrateur avec l'application quand il faut éffacer un fichier.

    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
     
    procedure TForm1.ResetClick(Sender: TObject);
    begin
    wd :=  GetWinFolder_V1($0025); //Path[CSIDL_SYSTEM] ;
    Dossier := '\oobe\info\Backgrounds';
     
      fileSource := chappli + '\BackgroundDefault.jpg' ;
      fileDest := wd + Dossier + '\BackgroundDefault.jpg';
     
     StatusBar1.SimpleText := (wd + Dossier + '\BackgroundDefault.Jpg') ;
     
    if FileExists(pchar(filedest)) then
     
         DelTree(pchar(filedest));
          else
          showmessage('Le logon par défaut est ok');
    end;
    @+,

    Cincap

  14. #14
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Toujours en dur, touche delete sur le fichier, c'est ok.
    As-tu tenté de passer par d'autres variables d'environnement, afin de pointer sur le folder système en question ?

    Car l'UAC doit intercepter le message et... Mais contrôle t-elle tous les messages ?

    @+

  15. #15
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    Donc dans votre fonction
    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
     
    Function DelTree(DirName : string): Boolean;
    var
      SHFileOpStruct : TSHFileOpStruct;
      DirBuf : array [0..255] of char;
      boo : boolean;
    begin
      SetPrivilege('SeRestorePrivilege',true,boo);
      try
       Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
       FillChar(DirBuf, Sizeof(DirBuf), 0 ) ;
       StrPCopy(DirBuf, DirName) ;
       with SHFileOpStruct do begin
        Wnd := 0;
        pFrom := @DirBuf;
        wFunc := FO_DELETE;
        //fFlags := FOF_ALLOWUNDO;   //Evite la poubelle
        fFlags := fFlags or FOF_NOCONFIRMATION;
        fFlags := fFlags or FOF_SILENT;
       end; 
        Result := (SHFileOperation(SHFileOpStruct) = 0) ;
       except
        Result := False;
      end;
      SetPrivilege('SeRestorePrivilege',boo,boo);
    end;
    et le code de SetPrivilege
    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
    function SetPrivilege(Privilege: PChar; EnablePrivilege: boolean; out PreviousState: boolean): DWORD;
    var
      Token: THandle;
      NewState: TTokenPrivileges;
      Luid: TLargeInteger;
      PrevState: TTokenPrivileges;
      Return: DWORD;
    begin
      PreviousState := True;
      if (GetVersion() > $80000000) then
        Result := ERROR_SUCCESS
      else
      begin
        if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
          Result := GetLastError()
        else
        try
          if not LookupPrivilegeValue(nil, Privilege, Luid) then
            Result := GetLastError()
          else
          begin
            NewState.PrivilegeCount := 1;
            NewState.Privileges[0].Luid := Luid;
            if EnablePrivilege then
              NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
            else
              NewState.Privileges[0].Attributes := 0;
            if not AdjustTokenPrivileges(Token, False, NewState,
              SizeOf(TTokenPrivileges), PrevState, Return) then
              Result := GetLastError()
            else
            begin
              Result := ERROR_SUCCESS;
              PreviousState :=
                (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
            end;
          end;
        finally
          CloseHandle(Token);
        end;
      end;
    end;
    A+

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ FBalien, merci de ton aide, j'ai essayé de compiler et j'obtiens l'erreur "identificateur non déclaré concernant setprivilege" dans la fonction Deltrée.

    Je n'ai certainement pas tout compris !

    Je verrai cela demain, bonne nuit à tous.

    @+,

    Cincap

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Fbalien, les fonctions sont en place, cela compile bien.

    J'ai effectué deux tests, le premier depuis un dossier différent afin de tester le chemin et cela ne fonctionne pas.

    Le deuxième directement dans le dossier concerné et là non plus cela ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    chappli := ExtractFilePath(Application.ExeName);
    DelTree(chappli + 'BackgroundDefault.jpg');
    A ne rien comprendre.

    @+,

    Cincap

  18. #18
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Si je ne m'abuse, la fonction DelTree attend un nom de dossier et non un nom de fichier.

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ ero-sennin, Hello, tu as tout à fait raison, mais comme j'ai déjà la main sur ce dossier puisque je peux manuellement copier, déleter ect...,j'étais fixé sur le fichier.

    Désolé, je ne vois pas comment adapter ce code ou alors combiné Deltree et deletefile ?

    Mais cela ne fonctionne quand même pas ou alors ma logique du chemin est erronée.

    L'application est dans le dossier INFO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    chappli := ExtractFilePath(Application.ExeName);
     
    fileSource := chappli + '\Backgrounds\BackgroundDefault.jpg' ;
     
    DelTree(pchar(chappli + '\Backgrounds'));
     
    if FileExists(pchar(filesource)) then
     
         Deletefile(pchar(filesource))
          else
          showmessage('Le logon par défaut est ok');
    @+,

    Cincap

  20. #20
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Question toute bête, que d'ailleurs tu as certainement déjà testé mais : as-tu vérifié à l'aide d'un ShowMessage, la validité de tes chemins ?

    Pas plus tard qu'hier, je me suis fait avoir avec un slash résiduel

    @+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/06/2007, 15h27
  2. [ORA-00157] J'ai effacé tous les fichiers de données
    Par sniperseb dans le forum Oracle
    Réponses: 14
    Dernier message: 02/02/2006, 11h15
  3. [Configuration] problème pour forcer le téléchargement d'un fichier
    Par All Bran dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 02/01/2006, 16h23
  4. [HTML] forcer l'enregistrement d'un fichier
    Par krfa1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 28/11/2005, 23h58
  5. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54

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