Si un fichier portant le même nom existe déjà dans le répertoire, le nom du nouveau fichier sera modifié en ajoutant un numéro d'ordre incrémenté à chaque fois.
J'avais écrit ces routines pour un de mes programmes. Je les ai remaniées pour en faire une fonction facilement utilisable. Il se peut dans ces conditions que le code ait besoin d'être optimisé, ou que certaines "protections" ne soient pas exactement adaptées à l'usage que vous comptez en faire, car j'ai travaillé un peu vite... en réponse à une question posée sur le forum.
Autre utilisation à envisager : en enlevant l'instruction "if not FileExists(Fichier) then Exit;", on doit pouvoir détourner l'usage initial et simplement incrémenter une série de fichiers... à vous de voir !
Commentaires sur la fonction :
function IncIfExists(Fichier: String; W: Word): String;
Fichier: Chemin + Nom du fichier (FileName quoi...)
W: Longueur (Length) de l'incrément, par exemple 2 donnera 01, 02, 03, ... 99, 3 donnera 001, 002, 003, ... 999, etc...
Si Fichier existe, il ne sera pas écrasé, le fichier portant le même nom se verra rajouter un numéro d'ordre.
Exemple:
NomFichier := IncIfExists('C:\Chemin\Fichier.ext', 4);
Si "Fichier.ext" existe déjà dans le répertoire, la chaîne retournée sera :
"Fichier0001.ext", ou "Fichier0002.ext", etc... jusqu'à "Fichier9999.ext".
Source / Exemple :
Exemple d'utilisation et commentaires détaillés dans le zip.
function IncIfExists(Fichier: String; W: Word): String;
const LongMaxInc = 9;
var i: Integer;
Pat: String;
Fic: String;
Ext: String;
NoExt: String;
function SetLengthNum(Nombre, Long: Integer): String;
var i: Integer;
Zero: String;
Long2: Integer;
begin
Result := '';
Zero := '';
Long2 := Length(IntToStr(Nombre));
for i := 1 to Long - Long2 do
Zero := Zero + '0';
Result := Zero + IntToStr(Nombre);
end;
begin
if (W < 1) or (W > LongMaxInc) then Exit;
Result := Fichier;
if not FileExists(Fichier) then Exit;
i := 1;
Pat := ExtractFilePath(Fichier);
Fic := ExtractFileName(Fichier);
Ext := ExtractFileExt(Fichier);
NoExt := Copy(Fic, 1, Pos(Ext, Fic) -1);
while FileExists(Pat + NoExt + SetLengthNum(i, W) + Ext) do
Inc(i);
Result := Pat + NoExt + SetLengthNum(i, W) + Ext;
end;
Conclusion :
Compilable dès Delphi 4 (voire antérieur), comme d'hab !
Merci pour ton commentaire, sergejb. Concernant l'utilisation de l'option [ofOverwritePrompt], je cherche précisément à éviter absolument tout message d'alerte, cette fonction étant destinée essentiellement à un traitement automatisé de fichiers qui porteraient éventuellement le même nom, mais qui ne seraient pas identiques (traitement d'images en série, etc...).
Dans cet esprit, et pour cet usage, elle est fiable, mais ça ne veut pas dire qu'elle n'est pas perfectible, je la reprendrai sans doute pour l'améliorer. Si l'on choisit W := 1, par exemple, on va passer de "fichier9.ext" à "fichier10.ext", ce qui n'est pas génant, même si "fichier10.ext" existe déjà, un fichier existant de même nom n'étant jamais écrasé, mais bon...
SaveDialog1.Options := [ofOverwritePrompt];
on déclenche également automatiquement un message d'alerte qui evite l'écrasement. Alors une version simplifiée de la fonction IncIfExists peut etre codée, qui évite le test d'existence du fichier.
Bravo pour l'idée
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.