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

Soyez le premier à donner votre avis sur cette source.

Vue 9 904 fois - Téléchargée 672 fois

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

Ajouter un commentaire

Commentaires

Messages postés
106
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
24 octobre 2005

j' ai un petit blem'. je te l' ai decris dans mon message sur le forum.
Messages postés
1722
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
22 octobre 2020
5
Ça répond à ce que tu cherchais, Joleroy ?
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...
Messages postés
20
Date d'inscription
mercredi 16 octobre 2002
Statut
Membre
Dernière intervention
12 juin 2006

Routine intéressante pour créer des versions incrémentales par exemple lors de sauvegardes automatiques ou de traitement à risques. Si on utilise complètement les options de SaveDialog (voir aide Borland):
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
Messages postés
106
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
24 octobre 2005

merci pour ton aide a +++

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.