Je sais que la fonction FileCopy
peut être utilisée pour copier des fichiers dans la section [Code]
et cela fonctionne très bien dans la plupart des cas. Cependant, existe-t-il un moyen d'invoquer l'opération de copie de fichiers Windows native, de sorte que la boîte de dialogue de copie de fichiers Windows standard avec progression, temps restant etc est affichée (ie identique à Ctrl+C
, suivi de Ctrl+V
), ce qui permettra également à l'utilisateur annuler ou mettre en pause l'opération de copie en cours de processus? Ou, mieux encore, existe-t-il un moyen de répliquer des fonctionnalités similaires directement dans la section [Code]
?Inno Setup appelle ou réplique opération de copie de fichier Windows natif
Répondre
Utilisation SHFileOperation
avec FO_COPY
:
type
TSHFileOpStruct = record
hwnd: HWND;
wFunc: UINT;
pFrom: string;
pTo: string;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: string;
end;
const
FO_COPY = $0002;
FOF_NOCONFIRMATION = $0010;
function SHFileOperation(lpFileOp: TSHFileOpStruct): Integer;
external '[email protected] stdcall';
procedure ShellCopyFile;
var
FromPath: string;
ToPath: string;
FileOp: TSHFileOpStruct;
begin
FromPath :=
ExpandConstant('{src}\data1.dat') + #0 +
ExpandConstant('{src}\data2.dat') + #0;
ToPath := ExpandConstant('{app}') + #0;
FileOp.hwnd := WizardForm.Handle;
FileOp.wFunc := FO_COPY;
FileOp.pFrom := FromPath;
FileOp.pTo := ToPath;
FileOp.fFlags := FOF_NOCONFIRMATION;
if SHFileOperation(FileOp) <> 0 then
begin
MsgBox('Copying failed.', mbError, MB_OK);
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
ShellCopyFile;
end;
end;
Le code est pour la version Unicode de Inno Setup.
Merci Martin. Cela semble plutôt parfait. Est-il possible de passer plusieurs fichiers à copier? Il semble que cela soit limité à un fichier à la fois? –
Bien sûr, c'est possible. Voir la documentation de la structure ['SHFILEOPSTRUCT'] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/bb759795.aspx) et ma réponse éditée. En fait, j'ai eu un bug dans le code précédent. Vous pouvez utiliser une liste de fichiers ou un caractère générique pour spécifier plusieurs fichiers pour l'opération. –
L'API Windows SHFileOperation() (ou moins facilement IFileOperation) est ce que vous devez invoquer le code pour y parvenir. –