Ne pas écraser un fichier existant - renommer le fichier créé en ajoutant un numéro d'ordre

Description

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 !

Codes Sources

A voir également

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.