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 :

Copie de répertoire et de son contenu


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 57
    Points : 56
    Points
    56
    Par défaut Copie de répertoire et de son contenu
    Bonjour,

    J'avais lancé un sujet dans le forum Delphi pour avoir une aide quant à la copie d'un répertoire ainsi que tout son contenu (sous-répertoires inclus).

    On m'a renvoyé vers le FAQ qui répondait à cette question. Par contre, ayant découvert Lazarus, j'ai essayé d'utiliser la fonction CopyFolder :
    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
    function CopyFolder(FromFld, ToFld: string): boolean;
    var fos: TSHFileopStruct;
    begin
    // il faut supprimer les antislashs de fin sinon vous aurez droit à un message d'erreur
      FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld));
      ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld));
     
      FillChar(fos, SizeOf(fos),0);
      with fos do
      begin
        wFunc := FO_COPY;
        pFrom := PChar(FromFld+#0);
        pTo   := PChar(ToFld+#0);
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      Result := ShFileOperation(fos)=0;
    end;
    Elle ne fonctionne pas (alors qu'elle fonctionne parfaitement sous Delphi) et me renvoie cette erreur :
    Unit1.pas(30,3) Hint: Local variable "fos" does not seem to be initialized
    Unit1.pas(38,32) Error: Incompatible type for arg no. 1: Got "_SHFILEOPSTRUCTA", expected "LPSHFILEOPSTRUCTW"
    Unit1.pas(46) Fatal: There were 1 errors compiling module, stopping
    Est-ce que quelqu'un aurait une idée ?

    Merci d'avance.

    Lohot

  2. #2
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Peut on voir la ligne 38 de ton code?

    Le message d'erreur indique qu'il s'agit d'une erreur dans le type d'argument passé.

    Merci de nous en montrer plus.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 57
    Points : 56
    Points
    56
    Par défaut
    Bonjour Clandestino,

    Comme demandé, je t'envois la ligne 38, de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := ShFileOperation(fos)=0;
    ainsi que le code entier :

    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
     
    unit Unit1; 
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ShellAPI,
      StdCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
     
    var
      Form1: TForm1; 
     
    implementation
     
    function CopyFolder(FromFld, ToFld: string): boolean;
    var fos: TSHFileopStruct;
    begin
    // il faut supprimer les antislashs de fin sinon vous aurez droit à un message d'erreur
      FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld));
      ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld));
     
      FillChar(fos, SizeOf(fos),0);
      with fos do
      begin
        wFunc := FO_COPY;
        pFrom := PChar(FromFld+#0);
        pTo   := PChar(ToFld+#0);
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      Result := ShFileOperation(fos)=0;
    end;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if CopyFolder('d:\Repertoire01', 'c:\Repertoire02')then
         ShowMessage('Copie effectuée avec succès') else
         ShowMessage('Copie non effectuée');
    end;
     
    initialization
      {$I unit1.lrs}
     
    end.
    Merci

    Lohot

  4. #4
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Bon à prioris la igne 38 est celle ci :

    Result := ShFileOperation(fos)=0;

    Lazarus définit ShFileOperation de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function SHFileOperationA(lpFileOp:LPSHFILEOPSTRUCTA ):Longint;external 'shell32.dll' name 'SHFileOperationA';
    Function SHFileOperationW(lpFileOp:LPSHFILEOPSTRUCTW ):Longint;external 'shell32.dll' name 'SHFileOperationW';
     
    Function SHFileOperation(lpFileOp:LPSHFILEOPSTRUCTA ):Longint;external 'shell32.dll' name 'SHFileOperationA';
    Function SHFileOperation(lpFileOp:LPSHFILEOPSTRUCTW ):Longint;external 'shell32.dll' name 'SHFileOperationW';
    alors que Delphi le fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {$EXTERNALSYM SHFileOperation}
    function SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer; stdcall;
    {$EXTERNALSYM SHFileOperationA}
    function SHFileOperationA(const lpFileOp: TSHFileOpStructA): Integer; stdcall;
    {$EXTERNALSYM SHFileOperationW}
    function SHFileOperationW(const lpFileOp: TSHFileOpStructW): Integer; stdcall;
    On a donc affaire à un pointer vers une structure, dans lazarus, et à une structure dans delphi.

    on peut donc corriger ton code en utilisant un pointeur :
    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
    function CopyFolder(FromFld, ToFld: string): boolean;
    var fos: TSHFileopStruct;
    pfos : LPSHFILEOPSTRUCT;
    begin
    // il faut supprimer les antislashs de fin sinon vous aurez droit à un message d'erreur
      FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld));
      ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld));
     
      FillChar(fos, SizeOf(fos),0);
      with fos do
      begin
        wFunc := FO_COPY;
        pFrom := PChar(FromFld+#0);
        pTo   := PChar(ToFld+#0);
        fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
      end;
      pfos^ := fos;
      Result := ShFileOperation(pfos)=0;
    end;
    Bonne continuation

Discussions similaires

  1. [AC-2013] déplacement d'un répertoire et de son contenu
    Par Gerard.chery dans le forum VBA Access
    Réponses: 0
    Dernier message: 17/03/2015, 15h56
  2. [XL-2003] recherche un fichier dans des sous répertoire et recopier son contenu
    Par hallscar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/12/2011, 20h30
  3. Déplacer un répertoire et son contenu
    Par choubiroute dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2006, 12h59
  4. Réponses: 9
    Dernier message: 24/10/2005, 18h42
  5. Comment copier un répertoire et son contenu ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 20/06/2004, 17h40

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