Pour quelqu'un qui débute, l'utilisation de BloRead et BlockWrite est un peu compliqué. A mon sens, celà n'a d'utilité que si l'on souhaite afficher une progression lors de la copie.
Aussi, voici un code standard qui fonctionne
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
{-----------------------------------------------------------------------------
Unit Name: UMainDeplacForm
Author: delphiprog
Purpose: Copier un fichier .BMP, choisi par l'utilisateur, dans le
répertoire où est installé Windows et nomme la copie en
OEMLogo.bmp
History: 18/01/2003 création pour Diabolic (Sylvain SOUZY)
-----------------------------------------------------------------------------}
unit UMainDeplacForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
btnSaveAndRename: TButton;
procedure FormCreate(Sender: TObject);
procedure btnSaveAndRenameClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
//WinDir reçoit le chemin de Windows
WinDir : array[0..Max_Path] of char;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
//Recherche du chemin où est installé Windows
GetWindowsDirectory(Windir, SizeOf(WinDir));
//obliger à sélectionner un fichier existant
with OpenDialog1 do
begin
Options := Options + [ofFileMustExist];
DefaultExt := 'BMP';
InitialDir := Windir;
Filter := 'Fichiers bitmap|*.bmp';
end;
end;
procedure TForm1.btnSaveAndRenameClick(Sender: TObject);
var
Source, Target : TFileStream;
begin
//Si l'utilisateur a appuyé sur OK
if OpenDialog1.Execute then
begin
//Ouverture de la source en lecture
Source := TFileStream.Create(Opendialog1.FileName, fmOpenRead or fmShareDenyWrite);
try
//Ouverture du fichier de destination en écriture
Target := TFileStream.Create(Windir + 'OEMLogo.bmp', fmOpenWrite or fmShareDenyRead);
try
//Copier le contenu de Source dans Target
Target.CopyFrom(Source, Source.Size);
finally
Target.Free;
end;
finally
Source.Free;
end;
end;
end;
end.
Il y a plusieurs manières de réaliser une copie de fichier.
-> copie binaire (BlockRead/BlockWrite)
-> caractères par caractères...
-> en utilisant les flux de fichiers (TFileStream).
NB : ici, je n'ai pas fixé le chemin de Windows à 'c:\Windows' car ce chemin n'est pas valable pour Win2k, NT, etc.
J'ai préférré le demander à Windows lui-même.
Attention aussi à l'utilisation de la méthode Execute sur les composants boites de dialogue : elle renvoie vrai si l'utilisateur a appuyé sur Ok et faux dans les autres cas.
En mettant ofFileMustExists dans les options, tu es dispensé de vérifier que le fichier sélectionné existe bien. C'est beaucoup plus sûr.
Bonne continuation et bon apprentissage de Delphi.
May Delphi be with you