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

Lazarus Pascal Discussion :

Comment supprimer un dossier "non vide" ? [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut Comment supprimer un dossier "non vide" ?
    Bonjour .

    Tout est dans le titre.

    RemoveDir() et RmDir() ne peuvent supprimer que des dossiers vides. J'ai bien trouvé une solution, dans la FAQ Delphi, qui utilise ShellAPI, mais ça n'est valable que sous Windows : or, je suis sous Linux .

    Si quelqu'un a une solution à me proposer, je suis preneur.

    Merci d'avance.

    Amicalement,
    naute

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par naute Voir le message
    or, je suis sous Linux

    man rm mais attention !
    /!\ /!\ Tu as grave intérêt à vérifier avant d'envoyer du lourd que tes variables pointent bien sur le dossier que tu veux supprimer ! /!\ /!\

    On a déjà vu des rm -rf / supprimer tout le disque, alors méfi !
    Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if length(dossier) > 1 then rm -rf dossier;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour Jipété .

    Je me suis peut-être mal exprimé. Je connais la commande rm, mais, en fait, je parlais de supprimer un dossier non vide depuis un programme Lazarus, pas depuis une console Linux : en gros dans une procédure que je lancerais en cliquant sur un bouton. Évidemment, je pourrais toujours exécuter un rm dans un process, mais je préférerais utiliser, si elle existe, une procédure Lazarus déjà implémentée : ce serait plus élégant.

    Je pensais que c'était implicite en faisant mention des procédures RmDir() et RemoveDir(), mais apparemment pas.

    Donc, ça ne résout pas mon problèmes, mais merci quand même.

    Amicalement,
    naute

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Voici ma proposition. À essayer...

    J'ai un doute concernant la partie relative aux attributs de fichier. Il faudrait que je creuse la question.

    (Code supprimé.)
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par naute Voir le message
    Évidemment, je pourrais toujours exécuter un rm dans un process, mais je préférerais utiliser, si elle existe, une procédure Lazarus déjà implémentée : ce serait plus élégant.
    Perso, je préfère l'efficacité à l'élégance et quand j'ai lu ce qui précède j'ai inconsciemment instantanément pensé à TProcess.

    Citation Envoyé par naute Voir le message
    Je pensais que c'était implicite en faisant mention des procédures RmDir() et RemoveDir(), mais apparemment pas.
    Bah nan car rmdir existe bien sous Linux,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut Naute

    il existe une autre commande FileUtil.DeleteDirectory dans l'unité "FileUtil"
    Sinon essayes en préfixant avec le nom des unités SysUtils.RemoveDir et System.rmDir.

    Essayes ça aussi (trouvé chez les anglais)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Result := DeleteDirectory(NomeDir,True);
      if Result then 
      begin
        Result := RemoveDirUTF8(NomeDir); //LazFileUTF8,/ LazFileUtils
      end;
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour .

    Citation Envoyé par Roland Chastain Voir le message
    J'ai un doute concernant la partie relative aux attributs de fichier.
    En ce qui concerne Linux, ton doute est justifié. Les attributs ne concernent que Windows. Sous Linux, on parle plutôt de "permissions" et leur gestion est différente.
    Merci pour ton code. Je vais regarder comment il fonctionne pour voir si je peux l'adapter à mon cas, mais techniquement, il ne répond pas à mon interrogation : existe-t-il dans Lazarus une procédure ou une fonction "toute faite" qui permet la suppression d'un dossier non vide. Comme je le disais ci-dessus, je peux également exécuter la commande rm dans un TPocess mais je préférerais une solution "native".

    Citation Envoyé par Jipété Voir le message
    Bah nan car rmdir existe bien sous Linux
    Voui ! mais pas RemoveDir() et la commande rmdir se passe des parenthèses contrairement à la procédure RmDir() .

    Pour préciser mes besoins, je dois créer, dans mon soft, un répertoire temporaire incluant des sous-répertoires et des fichiers, et, comme tout répertoire temporaire, le supprimer à la fermeture du soft.

    Amicalement,
    naute

  8. #8
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour Jérôme .

    Citation Envoyé par BeanzMaster Voir le message
    il existe une autre commande FileUtil.DeleteDirectory dans l'unité "FileUtil"
    Super : c'est pile-poil ce que je cherchais.
    En plus, cette procédure permet de supprimer soit le dossier complet, soit uniquement ce qu'il contient, en fonction du positionnement d'un flag, ce qui va peut-être m'être utile.


    Amicalement,
    Hervé

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    J'ai réécrit mon code, dont certains défauts m'étaient apparus. J'espère que la nouvelle version est correcte. Voir mon premier message.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Points : 2 790
    Points
    2 790
    Par défaut
    Bonjour Roland ,
    et .

    Citation Envoyé par Roland Chastain Voir le message
    J'espère que la nouvelle version est correcte.
    Peut-être que oui, mais le test que j'ai effectué ne fonctionne pas.

    Voici le code que j'ai utilisé :
    Code pascal : 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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
    unit base;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
     
    type
     
      { TFicheBase }
     
      TFicheBase = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
     
      public
      var
        LSimul: boolean;
        function DelTree(const ARoot: string): boolean;
     
      end;
     
    var
      FicheBase: TFicheBase;
     
    implementation
     
    {$R *.lfm}
     
     
     
    procedure TFicheBase.FormCreate(Sender: TObject);
    begin
      LSimul := True;
    end;
     
    procedure TFicheBase.Button1Click(Sender: TObject);
    begin
      if DelTree(GetCurrentDir + '/dossier1') then ShowMessage('OK !')
        else ShowMessage('Raté !')
    end;
     
    function TFicheBase.DelTree(const ARoot: string): boolean;
    var
      LRec: TSearchRec;
      LRes: integer;
      LRoot, LFileName: string;
    label
      __Exit;
    begin
      result := FALSE;
     
      if LSimul then
        WriteLn('REM Mode simulation');
     
      LRoot := IncludeTrailingPathDelimiter(ARoot);
      WriteLn('REM Exploration dossier: "', LRoot, '"');
     
      if not DirectoryExists(LRoot) then
      begin
        WriteLn('ERR Dossier introuvable: "', LRoot, '"');
        Exit;
      end;
     
      LRes := FindFirst(LRoot + '*', faAnyFile or faDirectory, LRec);
     
      while LRes = 0 do
      begin
        if (LRec.Name = '') or (LRec.Name = '.') or (LRec.Name = '..') then
        begin
          WriteLn('REM Ignore: "', LRec.Name, '"');
          LRes := FindNext(LRec);
          Continue;
        end;
        {$IFDEF WINDOWS}
        if (LRec.Attr and faReadOnly) = faReadOnly then
        begin
          WriteLn('REM Changement attribut: "', LFileName, '"');
          if FileSetAttr(LFileName, LRec.Attr - faArchive) = CFileSetAttrErr then
          begin
            WriteLn('ERR Echec changement attribut: "', LFileName, '"');
            goto __Exit;
          end;
        end;
        {$ENDIF}
        if (LRec.Attr and faDirectory) = faDirectory then
        begin
          if not Deltree(LRoot + LRec.Name) then
            goto __Exit;
        end else
        begin
          LFileName := LRoot + LRec.Name;
          WriteLn('REM Suppression fichier: "', LFileName, '"');
     
          if (not LSimul) and (not DeleteFile(LFileName)) then
          begin
            WriteLn('ERR Echec suppression fichier: "', LFileName, '"');
            goto __Exit;
          end;
        end;
        LRes := FindNext(LRec);
      end;
     
      WriteLn('REM Suppression dossier: "', LRoot, '"');
      if (not LSimul) and (not RemoveDir(LRoot)) then
      begin
        WriteLn('ERR Echec suppression dossier: "', LFileName, '"');
        goto __Exit;
      end;
     
      result := TRUE;
     
      __Exit:
      FindClose(LRec);
    end;
     
     
    end.
    J'ai juste fait les petites modifications pour pouvoir compiler ton code dans une application GUI.
    J'ai également supprimé :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const
      CFileSetAttrErr = -1;
    qui n'était pas utilisé.

    J'ai testé avec un dossier vide et un dossier contenant deux autres dossiers dont un contenant un fichier texte. Dans les deux cas, la fonction me renvoie "OK !" mais n'efface pas les dossiers.

    Alors, est-ce que ton code ne fonctionne pas ici car il est destiné à une application console ? Ça reste du Pascal et du moment que ça compile, je ne vois pas le problème. Qu'en penses-tu ?

    Cela dit, ne te casses pas trop la tête avec ça . La fonction DeleteDirectory() de l'unité FileUtil que m'a proposé Jérôme fonctionne parfaitement.


    Amicalement,
    Hervé.

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour Hervé ! Merci pour l'essai de mon code.

    Citation Envoyé par naute Voir le message
    Peut-être que oui, mais le test que j'ai effectué ne fonctionne pas.
    Aïe !

    Citation Envoyé par naute Voir le message
    Voici le code que j'ai utilisé :
    Il me semble que la variable LSimul n'est jamais passée à FALSE, ce qui fait que la fonction s'exécute en mode "simulation". J'ai ajouté cette variable pour qu'on puisse essayer le programme sans rien supprimer dans un premier temps, et je l'ai mise à TRUE pour n'avoir aucune responsabilité dans un éventuel accident.
    J'aurais dû le préciser dans les commentaires.

    Ce qui serait intéressant, même en laissant la valeur à TRUE, serait de lancer l'application depuis un terminal pour voir ce qui se passe.

    Citation Envoyé par naute Voir le message
    Cela dit, ne te casses pas trop la tête avec ça . La fonction DeleteDirectory() de l'unité FileUtil que m'a proposé Jérôme fonctionne parfaitement.
    Oui, ça, j'avais bien compris, mais je ne voulais pas laisser un code boiteux dans le forum.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/05/2008, 01h37
  2. Comment trouver la prochaine Cell non vide
    Par gilles06 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/01/2008, 10h35
  3. comment supprimer un dossier
    Par legrunge59570 dans le forum VB.NET
    Réponses: 8
    Dernier message: 13/08/2007, 12h41
  4. comment supprimer un dossier
    Par CIBOOX dans le forum Windows XP
    Réponses: 12
    Dernier message: 03/01/2007, 19h51
  5. Comment indiquer un critère chiane non vide
    Par le lynx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/08/2005, 12h38

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