PascalScript dans Syncovery
Syncovery intègre un moteur PascalScript, qui vous permet de personnaliser le comportement de votre profil de բազմաթիվ façons. PascalScript a été ajouté dans Syncovery 8, et de nombreux nouveaux points d’accroche et fonctions ont été ajoutés depuis la première version.
Pour modifier un comportement particulier, vous devez écrire une fonction d’accroche et ajouter du code. Dans la plupart des cas, notre support technique écrira le code pour vous. Pour les scripts plus importants ou plus complexes, veuillez envisager un Abonnement Premium Support incluant le développement de scripts personnalisés.
Le script est spécifié dans le profil via la case à cocher « Pascal Script… » dans l’onglet de catégorie Paramètres du travail.
Les PascalScripts ont accès à tous les paramètres du profil et peuvent les lire et les modifier à l’aide des fonctions utilitaires GetProfileProperty et SetProfileProperty.
Scripts utiles prêts à l’emploi
Les scripts suivants peuvent être utilisés tels quels : il suffit de coller le script dans la boîte de dialogue PascalScript.
- Raccourcir les chemins longs
Ce script raccourcit les noms de fichiers lorsque le chemin total dépasse 250 caractères. Il ajoute un hachage CRC32 basé sur le nom de fichier d’origine afin de garantir l’unicité des noms raccourcis. Les noms de dossier ne sont pas modifiés. Les noms raccourcis ne sont utilisés que lors de la copie de la gauche vers la droite. La partie gauche reste inchangée. - Raccourcir les noms de fichiers longs
Ce script raccourcit les noms de fichiers de plus de 114 caractères, en ajoutant un hachage CRC32 basé sur le nom de fichier d’origine afin de garantir l’unicité des noms raccourcis. Comme pour le script précédent, les noms de dossier ne sont pas modifiés, et les noms raccourcis n’affectent que la partie droite. - Convertir les caractères interdits sous Windows
Ce script vous permet d’utiliser les caractères interdits /:\?|<>« * dans les noms de fichiers sur le côté gauche. Le côté droit peut être un stockage compatible Windows tel qu’un lecteur NTFS local. - Notifications simples par e-mail
Ce script simplifie les notifications par e-mail et peut être facilement modifié pour personnaliser vos messages. - Envoyer des notifications par e-mail selon le résultat du profil
Ce script fait en sorte que des notifications par e-mail ne soient envoyées que si moins de 10 ou plus de 100 fichiers ont été copiés de gauche à droite. - Associer une connexion FTP à un port LAN spécifique
Ce script vous permet de préciser quel port LAN utiliser pour une connexion FTP. Notez que cela fonctionne uniquement avec la bibliothèque FTP 3 (sous Windows) ou 2 (sur les autres plateformes). - Supprimer les fichiers de plus de 30 jours de la partie source (gauche)
Ce script demande à Syncovery de supprimer les fichiers anciens de la partie source d’une synchronisation unidirectionnelle. La partie source doit être celle de gauche. La partie droite servira d’archive, où sont conservés tous les fichiers historiques, tandis que la partie gauche ne contient que les fichiers des 30 derniers jours. On suppose que les nouveaux fichiers apparaissent uniquement à gauche. Le profil doit être utilisé uniquement avec le mode d’opération « Copie standard ». Le nombre de jours peut être ajusté dans le script. Vous pouvez également choisir de supprimer les fichiers nouvellement copiés (peu probable, car ils ne sont probablement pas plus anciens que 30 jours) et/ou les fichiers qui existent déjà des deux côtés au moment où le travail s’exécute (cas le plus probable).
Hooks PascalScript disponibles
Les hooks suivants sont actuellement disponibles. Des hooks supplémentaires seront ajoutés au besoin pour répondre aux demandes des clients.
- OnActionComplete
- OnAfterFileCopy
- OnBeforeFileCopy
- OnBeforeFileUpload
- OnBeforeFolderCreate
- OnBeforeMainActionPhase
- OnCanRunProfile
- OnCloudConnect
- OnCloudDisconnect
- OnDownloadComplete
- OnFileCopy
- OnGetCustomHeaders
- OnGetNextRunTime
- OnGetProfilePathBeforeListing
- OnGetProfilePathBeforeCopying
- OnHttpPost
- OnIncludeItem
- OnLogFileClosed
- OnMoveFileToDeletedFolder
- OnNeedToReRun
- OnNoActionItem
- OnNormalizeFilename
- OnProfileStart
- OnProfileResults
- OnProgress
- OnReplaceFilenameLeftToRight
- OnReplaceFilenameRightToLeft
- OnScanFolder
- OnSendEmail
- OnSkipOrIgnoreItem
- OnUploadComplete
- OnVerifySSHServerFingerprint
- OnVerifyTLSCertificate
- OnVolumeShadowComplete
Fonctions PascalScript disponibles
Les fonctions suivantes sont disponibles pour que vous puissiez les appeler.
- fonctions standard telles que Pos, Copy, Length, Ord
- function GetProfileProperty(const fieldname:UnicodeString):UnicodeString;
- function SetProfileProperty(const fieldname:UnicodeString;const val:UnicodeString):Boolean;(ces fonctions utilisent les mêmes noms de champs que le format XML et la ligne de commande. Voir le dictionnaire de paramètres à la fin de la page Syncovery Command Line)
- function SaveProfileSettings:Boolean;
- procedure LoadFolderPriorityTextFile(const s:UnicodeString);
- function ConcatPath(const a,b:UnicodeString; const t: Int64):UnicodeString;
- function ConcatPathWithDelim(const a,b,delim:UnicodeString):UnicodeString;
- function ExtractFileName(const s: UnicodeString):UnicodeString;
- function ExtractFileNameFTP(const s: UnicodeString):UnicodeString;
- function ExtractFilePath(const s: UnicodeString):UnicodeString;
- function ExtractFilePathFTP(const s: UnicodeString):UnicodeString;
- function ExtractURLPartAfterServer(const s: UnicodeString):UnicodeString;
- function ExtractFileExt(const s: UnicodeString):UnicodeString;
- function ChangeFileExt(const s,t: UnicodeString):UnicodeString;
- function FileExists(const FileName: UnicodeString):Boolean;
- function FileExistsMatching(const FileName: UnicodeString):Boolean;
- function EntryExists(const FileName: UnicodeString):Boolean;
- function FileAge(const FileName: UnicodeString):Double;
- function FileCopy(const ASource,ADest:UnicodeString):Int64;
- function FileDelete(const AFile:UnicodeString):Int64;
- function FileRename(const ASource,ADest:UnicodeString):Int64;
- function ProfileRunning(const s: UnicodeString):Boolean;
- procedure Log(const s:UnicodeString);
- procedure MessageBox(const s:UnicodeString);
- function Execute(const s:UnicodeString; const TimeOutSeconds: Int64):Int64;
- function GetProfileName:UnicodeString;
- procedure SetProfileResult(const AResultText:UnicodeString);
- function CreateS3Connector(const BucketName,AccessID,SecretKey:UnicodeString;const Options:Integer):Opaque;
- function UploadFile(const LocalPath,DestinationPath:UnicodeString;const Connector:Opaque):Int64;
- function CloseConnector(const Connector:Opaque):Int64;
- function ConnFileExists(const Connector:Opaque; const FileName: UnicodeString):Boolean;
- function ConnDirectoryExists(const Connector:Opaque; const Name: UnicodeString):Boolean;
- function ConnCustomFTPCommand(const Connector:Opaque; const ACommand: UnicodeString;
const AOkResponse1,AOkResponse2,AOkResponse3:Integer;
var ResponseText: UnicodeString):Integer; - function ConnProcessWebForm(const Connector:Opaque;
const URL, AFormName, AField1, AValue1, AField2, AValue2: AnsiString;
const SaveResultPage: Boolean;
const SavePageFileName: UnicodeString): Boolean; - function ConnRenameFile(const Connector:Opaque; const AFromFileName,AToFileName: UnicodeString):Boolean;
- function ConnDeleteFile(const Connector:Opaque; const AFileName: UnicodeString):Boolean;
- function ConnDeleteFiles(const Connector:Opaque; const APath,AMask: UnicodeString):Integer;
- function ConnDeleteFilesOlderThan(const Connector:Opaque; const APath,AMask: UnicodeString;const AWhen:Double):Integer;
- function SendHTTPRequest(const requestype,mimetype,additionalheaders,URL,PostData:AnsiString;var ResultCode:Int64;var Response,ErrorResponse:AnsiString):Boolean;
- function StringReplace(const Source, OldPattern, NewPattern: UnicodeString;const CaseSensitive:Boolean): UnicodeString;
- function EncodeBase64(const s: UnicodeString):UnicodeString;
- function DecodeBase64(const s: UnicodeString):UnicodeString;
- function Utf8Encode(const s: UnicodeString):AnsiString;
- function Utf8Decode(const s: AnsiString):UnicodeString;
- function DecodeAnsiURL(const anurl:AnsiString):AnsiString;
- function DecodeUnicodeURL(const anurl:UnicodeString):UnicodeString;
- function UnicodeStringMD5Hex(const s: UnicodeString):UnicodeString;
- function EightBitStringMD5Hex(const s: AnsiString):AnsiString;
- function UnicodeStringMD5Base64(const s: UnicodeString):UnicodeString;
- function EightBitStringMD5Base64(const s: AnsiString):AnsiString;
- function UnicodeStringCRC32Hex(const s: UnicodeString):UnicodeString;
- function EightBitStringCRC32Hex(const s: AnsiString):AnsiString;
- function UnicodeStringCRC32Base64(const s: UnicodeString):UnicodeString;
- function EightBitStringCRC32Base64(const s: AnsiString):AnsiString;
- function SimpleEncrypt(const s: UnicodeString):UnicodeString;
- function SimpleDecrypt(const s: UnicodeString):UnicodeString;
- function AESEncrypt(const s,passphrase: UnicodeString):UnicodeString;
- function AESDecrypt(const s,passphrase: UnicodeString):UnicodeString;
- function ChooseFile(const Prompt,Extension:UnicodeString):UnicodeString;
- function OpenIniFile(const AFileName:UnicodeString):Int64;
- procedure CloseIniFile(const AnIni:Int64);
- function ReadIniString(const AnIni:Int64;const Section,Ident,Default:UnicodeString):UnicodeString;
- function GetInput(const s: UnicodeString):UnicodeString;
- function GetPassword(const s: UnicodeString):UnicodeString;
- function ReadRegistryString(const Key,OptName:UnicodeString):UnicodeString;
- procedure WriteRegistryString(const Key,OptName,Value:UnicodeString);
- function GetProfileRunID:UnicodeString;
- procedure ClearBody;
- function GetBodyLine(const i:Integer):UnicodeString;
- procedure SetBodyLine(const i:Integer;const s:UnicodeString);
- procedure DeleteBodyLine(const i:Integer);
- procedure AddBodyText(const s:UnicodeString);
- function GetActionList:UnicodeString;
- function GetProfileSettings:UnicodeString;
- function Now:Double;
- function NowUTC:Double;
- function OffsetFromUTC:Double;
- function TimeToStr(const DateTime: Double):UnicodeString;
- function DateTimeToStr(const DateTime: Double):UnicodeString;
- function DateToStr(const DateTime: Double):UnicodeString’;
- function DateTimeToStrWithFormat(const DateTime: Double;const FormatString:UnicodeString):UnicodeString;
- function MakeSurePathExists(const s:UnicodeString;const isRightSide:Boolean):Boolean;
- function GetTempDir:UnicodeString;
- function GetTempFilename(const TryCreateIt:Boolean;const Extension:UnicodeString):UnicodeString;
- function PathDelim:UnicodeString;
- function LeftDelim:UnicodeString;
- function RightDelim:UnicodeString;
- function GetDelim(const Connector: Opaque):UnicodeString;
- function IncludeLeadingPathDelim(const s: UnicodeString):UnicodeString;
- function OpenTextFile(const s:UnicodeString):Opaque;
- function AppendTextFile(const s:UnicodeString):Opaque;
- function CreateTextFile(const s:UnicodeString):Opaque;
- procedure WriteLine(const F:Opaque;const ALine:UnicodeString);
- function ReadLine(const F:Opaque):UnicodeString;
- function EOF(const F:Opaque):Boolean;
- procedure CloseFile(const F:Opaque);
- function AtomicAppendTextFileLine(const APath,ALine:UnicodeString):Boolean;(ajoute une ligne de manière sûre pour les threads et les processus multiples)
- function YearOf(const dt:Double):Integer;
- function MonthOf(const dt:Double):Integer;
- function WeekOf(const dt:Double):Integer;
- function DayOf(const dt:Double):Integer;
- function DayOfTheWeek(const dt:Double):Integer;
- function SecondOf(const dt:Double):Integer;
- function HourOf(const dt:Double):Integer;
- function MinuteOf(const dt:Double):Integer;
- function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Integer): Double;
- function FileToCopyExistsLeft:Boolean;
- function FileToCopyExistsRight:Boolean;
- function FileToCopyLeftSize:Int64;
- function FileToCopyRightSize:Int64;
- function FileToCopyLeftModified:Double;
- function FileToCopyRightModified:Double;
- function CurrentFileModified:Double;
- function CurrentFileCreated:Double;
- function CurrentFileLastAccessed:Double;
- procedure CountDeletedFiles(const Left,Right:Integer);
(peut être utilisé avec des jokers dans le nom de fichier, mais pas dans les dossiers parents)
Variables globales disponibles
Ces variables globales permettent un accès direct aux champs internes de Syncovery. Certaines doivent être considérées en lecture seule tandis que d’autres peuvent être modifiées selon les besoins.
- ProfileTempDir: UnicodeString;
- LeftBasePath: UnicodeString;
- RightBasePath: UnicodeString;
- ProfileName: UnicodeString;
- ResultSummary: UnicodeString;
- LeftBindIP: UnicodeString;
- RightBindIP: UnicodeString;
- MinimumFreeSpaceLeft: Int64;
- MinimumFreeSpaceRight: Int64;
- MaxWaitWhenFreeSpaceLowSeconds: Integer;
- MinDate: Double;
- MaxDate: Double;
- FilterTimestamps: Boolean;
- FilterOnSourceSideOnly: Boolean;
- FiltersMustMatchOnBothSides:Boolean;
- NeedActionsLog: Boolean;
- UseBinaryCompToAvoidCopying: Boolean;
- RemoveEmptyFoldersOnlyOneLevelWhereAFileHasBeenRemoved: Boolean;
- IgnoreFileSizes: Boolean;
- SkipIfFileSizeChanging: Boolean;
- ActionsLogging: Boolean;
- FreeSpaceLogging: Boolean;
- CopyingStatisticsLogging: Boolean;
- FileCopyNoStatNeeded: Boolean;
- DoSmartTrackingDeletionsEvenIfOtherSideModified: Boolean;
Exemple de script OnActionComplete
Ce hook est appelé après qu’une action liée à un fichier ou dossier ait été exécutée, par exemple fichier copié, déplacé ou supprimé, etc. L’exemple se contente d’enregistrer l’action. Le résultat de la fonction est ignoré par Syncovery.
function OnActionComplete(const StartTimeUTC, CompletionTimeUTC: Double;
const Success: Boolean;
const ActionStr, DirectionStr, Filename,
LeftFile, RightFile, Subfolder, MovedTo,
ErrorMsg: UnicodeString;
const ResultCode: Int64;
const ErrorSide: UnicodeString;
const ASize,ACompressedSize:Int64):Boolean;
begin
Log('Action Complete: '+ActionStr+' '+DirectionStr+' '+Filename);
Result:=true;
end;
Exemple de script OnAfterFileCopy
Ce hook est appelé après la copie d’un fichier. Le résultat de la fonction est ignoré par Syncovery. Il est utilisé par l’exemple « Supprimer les fichiers sources (côté gauche) âgés de plus de 30 jours ».
function OnAfterFileCopy(const DirectionIsL2R:Boolean;
const Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString;
const ResultCode:Int64):Boolean;
begin
Log('File Copy Complete: '+Source+' to '+Dest);
Result:=true;
end;
Exemple de script OnCanRunProfile
Ce hook est appelé lorsque le planificateur s’apprête à lancer un profil. Vous pouvez décider s’il doit s’exécuter maintenant ou être reporté. L’exemple utilise le hook pour empêcher deux profils particuliers de s’exécuter en même temps ou de se chevaucher. Ce script doit être saisi en tant que PascalScript global via la boîte de dialogue Paramètres du programme, onglet Avancé.
const p1='Profile Name 1';
p2='Profile Name 2';
function OnCanRunProfile(const ProfileName:UnicodeString; var PostponeBySeconds:Integer):Boolean;
begin
if ProfileName=p1 then
Result:=not ProfileRunning(p2)
else
if ProfileName=p2 then
Result:=not ProfileRunning(p1)
else
Result:=true;
if not Result then
PostponeBySeconds:=60;
end;
Exemple de script OnFileCopy
Ce hook vous permet de remplacer la logique de copie de fichiers. Retournez 0 en cas de succès, -1 si Syncovery doit effectuer la copie de manière habituelle, ou toute autre valeur comme code d’erreur.
function OnFileCopy(const DirectionIsL2R:Boolean;
const Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString;
const SourceConnector,DestConnector: Opaque):Int64;
begin
Result:=Execute('XCOPY.EXE "'+Source+'" "'+DestPath+'"',60);
end;
Exemple de script OnGetCustomHeaders
Ce hook vous permet d’ajouter des en-têtes HTTP personnalisés aux requêtes Amazon S3. Dans de futures versions de Syncovery, cette fonctionnalité pourra être ajoutée à d’autres stockages cloud et protocoles (sur demande client — il suffit de le demander).
function OnGetCustomHeaders(const RelativePath: UnicodeString;
const URL:AnsiString;var MIMEType, Headers: AnsiString;
const Connector:Opaque):Boolean;
var strDate:string;
begin
Result:=true;
Headers:='Cache-Control: 10';
Log('');
Log('Headers Added to '+RelativePath);
Log(Headers);
Log('');
end;
Exemple de script OnGetNextRunTime
Ce hook vous permet de modifier la planification. La meilleure façon de l’utiliser est d’attribuer au profil un calendrier simple et régulier, puis d’utiliser le hook pour sauter les exécutions indésirables. Cet exemple est destiné à un profil programmé pour s’exécuter « tous les jours à XX:YY ». Le hook garantit qu’il ne s’exécute en fait que le premier jour ouvrable du mois.
function OnGetNextRunTime(const LastRun, ProposedNextRun: Double):Double;
var DidItRunThisMonth:Boolean;
begin
Result:=ProposedNextRun;
DidItRunThisMonth:=(MonthOf(LastRun)=MonthOf(Now)) and
(MonthOf(LastRun)=MonthOf(ProposedNextRun)) and
(DayOf(LastRun)<DayOf(ProposedNextRun));
if DidItRunThisMonth then begin
// go to the next month
while DayOf(Result)>1 do
Result:=Result+1;
end
else begin
// go to the next month if we are beyond week #1
while DayOf(Result)>7 do
Result:=Result+1;
end;
// second, advance further until it's not a weekend
while DayOfTheWeek(Result)>=6 do
Result:=Result+1;
end;
Exemples de scripts OnIncludeItem
Le point d’accroche OnIncludeItem est appelé individuellement pour chaque côté de la synchronisation. Le paramètre isRightSide indique le côté que nous examinons actuellement.
Le script suivant sert à exclure les fichiers sans extension de nom de fichier. Une telle exclusion n’est pas possible via les masques d’exclusion.
function OnIncludeItem(const FileName, RelativePath: UnicodeString;
const isRightSide, isFolder:Boolean;
const FileSize:Int64; const FileAttr:LongWord;
const Connector: Opaque):Boolean;
begin
Result:=isFolder or (Pos('.',FileName)>0);
end;
Le deuxième exemple pour OnIncludeItem ne traitera que les sous-dossiers contenant le fichier READY.toprocess, ainsi que tous les sous-dossiers existant du côté droit.
function OnIncludeItem(const FileName, RelativePath: UnicodeString;
const isRightSide, isFolder:Boolean;
const FileSize:Int64; const FileAttr:LongWord;
const Connector: Opaque):Boolean;
begin
Result:=isRightSide or not isFolder or
ConnFileExists(Connector,ConcatPath(ConcatPath(LeftBasePath,RelativePath,Connector),FileName,Connector)+
'\READY.toprocess');
end;
Exemple de script OnScanFolder
C’est probablement une meilleure méthode pour rechercher ‘READY.toprocess’. Le hook OnScanFolder est appelé juste avant le scan du dossier, et la connaissance des deux côtés peut être utilisée dans le hook.
function OnScanFolder(const FolderLevel: Integer;
const RelativePath, LeftCompletePath, RightCompletePath: UnicodeString;
const LeftExists,RightExists:Boolean;
const LeftConnector, RightConnector: Opaque):Boolean;
begin
Result:=RightExists or ConnFileExists(LeftConnector,LeftCompletePath+'\READY.toprocess');
end;
Exemple de script OnProfileStart
Cette fonction peut être utilisée pour vérifier ou modifier les paramètres du profil au démarrage, y compris certaines fonctionnalités qui ne peuvent être débloquées que via PascalScript. L’exemple vérifie si l’une des cases « Ignorer le buffering de fichier » est cochée et les décoche.
var Checked:Boolean;
function OnProfileStart:Boolean;
begin
Result:=true;
if Checked then
Exit;
Checked:=true;
if (GetProfileProperty('BypassOSFileBufferingLeft')='Yes') or
(GetProfileProperty('BypassOSFileBufferingRight')='Yes') then begin
SetProfileProperty('BypassOSFileBufferingLeft','No');
SetProfileProperty('BypassOSFileBufferingRight','No');
SaveProfileSettings;
Log('');
Log('Bypass File Buffering has been removed via PascalScript.');
end
else begin
Log('');
Log('File buffering settings have been verified via PascalScript.');
end;
end;
Exemple de script OnProfileResults
Ce script ne fait rien, mais la fonction est appelée avec quelques statistiques à la fin d’un profil. Un exemple plus complet peut être téléchargé en haut de cette page (« Envoyer des notifications par e‑mail selon les résultats du profil »). La valeur de retour de cette fonction (« Result ») est ignorée.
function OnProfileResults(const FilesCopiedL2R,FilesCopiedR2L:Integer;
const FilesToCopyL2R,FilesToCopyR2L:Integer;
const BytesCopiedL2R,BytesCopiedR2L:Int64;
const ResultString:UnicodeString;
const Error:Boolean):Boolean;
begin
Result:=true;
end;
Exemple de script OnNormalizeFilename
Ce hook vous permet de « normaliser » les noms de fichiers afin que Syncovery considère des noms comme identiques malgré de petites différences. Le script d’exemple normalise les caractères d’espace, de sorte qu’il n’y ait toujours qu’un seul caractère d’espace entre les autres caractères. Deux espaces consécutifs ou plus sont normalisés en un seul espace. Le résultat est que Syncovery considère comme identiques des fichiers qui ont des nombres différents d’espaces consécutifs sur chaque côté du profil. Ces noms de fichiers ne sont pas modifiés sur le disque. La modification est purement en mémoire à des fins de comparaison. L’aperçu de synchronisation affichera les noms de fichiers normalisés.
function OnNormalizeFilename(const FileName: UnicodeString;
const isFolder, isRightSide: Boolean):UnicodeString;
var Changed:UnicodeString;
begin
Result:=FileName;
repeat
Changed:=StringReplace(Result,' ',' ',true);
if Changed=Result then
break;
Result:=Changed;
until false;
end;
Exemple de script OnReplaceFilenameLeftToRight
Ce script renommera les fichiers lorsque le fichier est copié de la gauche vers la droite. Dans notre exemple, « -draft » est ajouté avant l’extension du fichier.
function OnReplaceFilenameLeftToRight(const FileName: UnicodeString;
const isFolder: Boolean):UnicodeString;
begin
if isFolder then
Result:=FileName
else
Result:=ChangeFileExt(FileName,'-draft')+ExtractFileExt(FileName);
end;
Exemple de script OnReplaceFilenameRightToLeft
Si vous effectuez une synchronisation bidirectionnelle et que de nouveaux fichiers peuvent apparaître côté droit, nous avons aussi besoin d’un moyen de renommer dans l’autre sens. Ce script d’exemple supprime l’insertion « -draft » des noms.
function OnReplaceFilenameRightToLeft(const FileName: UnicodeString;
const isFolder: Boolean):UnicodeString;
var ToFind:UnicodeString;
P:Integer;
begin
if isFolder then
Result:=FileName
else begin
ToFind:=''-draft''+ExtractFileExt(FileName);
p:=Pos(ToFind,FileName);
if p>0 then
Result:=Copy(FileName,1,p-1)+ExtractFileExt(FileName)
else
Result:=FileName
end;
end;
Exemple de script OnUploadComplete
Ce script définira les permissions des fichiers téléchargés via FTP sur 777.
function OnUploadComplete(const FileName, LocalFilePath, CompleteURL: UnicodeString;
const isRightSide:Boolean;
const FileSize:Int64;
const Connector: Opaque):Boolean;
var CmdRes:Int64;
ResponseText:UnicodeString;
begin
CmdRes:=ConnCustomFTPCommand(Connector,'SITE CHMOD 777 '+FileName,200,200,200,ResponseText);
Log('Set Permissions for '+FileName+': '+ResponseText);
Result:=true;
end;
Exemple de script OnDownloadComplete
Ce script renomme les fichiers téléchargés en ajoutant une extension supplémentaire « .downloaded ». »
function OnDownloadComplete(const FileName, CompleteURL, LocalFilePath: UnicodeString;
const isRightSide:Boolean;
const FileSize:Int64;
const Connector: Opaque):Boolean;
begin
if ConnRenameFile(Connector,CompleteURL,FileName+'.downloaded') then
Log('Renamed '+FileName+' to '+FileName+'.downloaded')
else
Log('Rename failed: '+FileName+' to '+FileName+'.downloaded');
Result:=true;
end;
Exemple de script OnVolumeShadowComplete
Ce script exécutera une commande externe (fichier batch ou CMD) juste après la création d’un cliché instantané de volume.
function OnVolumeShadowComplete(const Volume,ShadowPath:UnicodeString):Boolean;
begin
Result:=Execute('C:\Tests\test.bat',120)=0;
end;
Exemple de script OnBeforeFolderCreate
Ce script empêchera toute création de dossier sauf lorsque cela est nécessaire pour copier des fichiers vers la destination. Vous pouvez aussi utiliser ce hook pour manipuler les chemins de dossiers sur la destination.
function OnBeforeFolderCreate(const DirectionIsL2R:Boolean;
var Source,Dest,Reason:UnicodeString):Boolean;
begin
Result:=false;
end;
Exemple de script OnBeforeFileCopy
Ce script manipulera les chemins de destination pour la copie (gauche vers droite), en ajoutant un sous-dossier supplémentaire « archive » qui n’existe pas côté source.
function OnBeforeFileCopy(const DirectionIsL2R:Boolean;
var Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString):Boolean;
var AddFolderName,NewDestPath,NewDest,NewRightSubPath:UnicodeString;
begin
Result:=true;
if not DirectionIsL2R then
Exit;
AddFolderName:='archive';
NewDestPath:=ConcatPathWithDelim(DestPath,AddFolderName,PathDelim);
NewDest:=ConcatPathWithDelim(NewDestPath,ExtractFileName(Dest),PathDelim);
NewRightSubPath:=IncludeLeadingPathDelim(ConcatPathWithDelim(RightSubPath,AddFolderName,PathDelim));
if not MakeSurePathExists(NewDestPath,true) then begin
Log('Could not create '+NewDestPath);
Exit;
end;
Log('OnBeforeFileCopy');
Log('Source:'+Source);
Log('DestPath:'+DestPath+' changed to '+NewDestPath);
Log('Dest:'+Dest+' changed to '+NewDest);
Log('LeftSubPath:'+LeftSubPath);
Log('RightSubPath:'+RightSubPath+' changed to '+NewRightSubPath);
Log('');
Dest:=NewDest;
DestPath:=NewDestPath;
RightSubPath:=NewRightSubPath;
end;
Exemple de script OnBeforeFileUpload
Ce script est appelé avant un envoi de fichier via un protocole Internet et peut être utilisé pour modifier le comportement d’upload. La fonction d’exemple ci‑dessous lance un scanner antivirus avant l’envoi.
function OnBeforeFileUpload(const DirectionIsL2R:Boolean;
var Source,Dest,DestPath,LeftSubPath,RightSubPath,ErrorMsg:UnicodeString;
var ErrorCode:Int64):Boolean;
begin
if not DirectionisL2R then begin
Result:=true;
Exit;
end;
Result:=Execute('"C:\Program Files\ClamAV\clamscan.exe" '+Source,60)=0;
if Result then
Log('Virus scan OK: '+Source)
else begin
Log('Virus scan failed, not uploading: '+Source);
ErrorMsg:='Virus detected';
ErrorCode:=$E1;
end;
end;
Exemple de script OnHttpPost
Ce hook peut être utilisé pour activer l’envoi de fichiers via le protocole HTTP. Le script doit définir les en-têtes et propriétés de formulaire pertinents.
function OnHttpPost(const RelativePath : UnicodeString;
var URL, MIMEType, Header : AnsiString; var LAsForm : Boolean;
var LFormData : AnsiString;
const Connector : Opaque) : Boolean;
begin
URL := 'https://fr.syncovery.com';
Header := 'Authorization: Bearer abcdefghijklmnopqrstuvwxyz';
LAsForm := true;
Result := true;
LFormData := 'orderstates';
Log('');
Log('Header Added to '+RelativePath);
Log(Header);
Log('');
end;
Exemple de script OnGetProfilePathBeforeListing
Ce script utilise ce hook pour spécifier un dossier TEMP individuel pour le profil. L’objectif original de la fonction est de modifier le chemin gauche ou droit et/ou les identifiants (credentials).
function OnGetProfilePathBeforeListing(const isRightSide:Boolean;
var Path,UserName,Password:UnicodeString;
var AuthKey,AuthKeyPassword:AnsiString;
var Port:Integer):Boolean;
begin
ProfileTempDir:='H:\TEMP';
Result:=true;
end;
Exemple de script OnGetProfilePathBeforeCopying
Ce hook peut être utilisé pour modifier le chemin et/ou les identifiants. Le script d’exemple ne fait rien.
function OnGetProfilePathBeforeCopying(const isRightSide:Boolean;
var Path,UserName,Password:UnicodeString;
var AuthKey,AuthKeyPassword:AnsiString;
var Port:Integer):Boolean;
begin
Result:=true;
end;
Exemple de script OnBeforeMainActionPhase
Ce script permet au travail de s’exécuter uniquement si un nombre fixe de fichiers doit être copiés de la gauche vers la droite.
function OnBeforeMainActionPhase(const CopyL2RCount,CopyR2LCount,DeleteLCount,DeleteRCount,MoveLCount,MoveRCount:Int64;
const CopyL2RBytes,CopyR2LBytes,DeleteLBytes,DeleteRBytes,MoveLBytes,MoveRBytes:Int64):Boolean;
begin
if CopyL2RCount=14 then
Result:=true
else begin
Result:=false;
Log('Not continuing because CopyL2RCount is '+IntToStr(CopyL2RCount));
end;
end;
Exemple de script OnCloudConnect
Ce script peut être utilisé pour se connecter à un site web lors de l’utilisation du protocole HTTP pour télécharger des fichiers depuis une URL.
function OnCloudConnect(const URL:AnsiString;
const isRightSide,isFirstConnectionInJob:Boolean;
const Connector: Opaque):Boolean;
begin
if isFirstConnectionInJob and not isRightSide then
Result:=ConnProcessWebForm(Connector,
'https://www.superflexible.com/usrlogin.php?',
'login',
'username','tobias',
'password','abcdefghijklmn',
false,'')
else
Result:=true;
end;
Exemple de script OnCloudDisconnect
Ce point d’accroche est appelé avant la déconnexion finale d’un serveur cloud ou FTP, à la fin de l’exécution d’un profil.
Il peut être utilisé pour effectuer certaines tâches finales.
Le script d’exemple ne fait rien.
function OnCloudDisconnect(const URL:AnsiString;
const isRightSide,isMainConnectionInJob,isFinalDisconnection:Boolean;
const Connector: Opaque):Boolean;
begin
Log('Before final disconnection');
Result:=true;
end;
Exemple de script OnLogFileClosed
Ce script copie le fichier journal vers un autre dossier après la fermeture du fichier journal.
function OnLogFileClosed(const FileName:UnicodeString):Boolean;
begin
FileCopy(FileName,'E:\LogCopies\'+ExtractFileName(FileName));
Result:=true;
end;
Exemple de script OnMoveFileToDeletedFolder
Ce script empêche de conserver plusieurs versions des fichiers supprimés en supprimant d’abord l’éventuel fichier existant du dossier de fichiers supprimés.
function OnMoveFileToDeletedFolder(const Path:UnicodeString;
var MoveToPath:UnicodeString;
var proceedToDeleteInsteadOfMoving:Boolean;
const Connector:Opaque):Boolean;
begin
if FileExists(MoveToPath) then FileDelete(MoveToPath);
Result:=true;
end;
Exemple de script OnNeedToRerun
Ce script force la réexécution du travail jusqu’à ce que la condition attendue soit remplie (au moins un fichier a été copié).
function OnNeedToReRun(const FilesCopiedL2R,FilesCopiedR2L:Integer;
const FilesToCopyL2R,FilesToCopyR2L:Integer;
const BytesCopiedL2R,BytesCopiedR2L:Int64;
const ResultString:UnicodeString;
const Error:Boolean):Boolean;
begin
if FilesCopiedL2R+FilesCopiedR2L>0 then
Result:=false
else
Result:=true;
end;
