Une procédure de suppression de fichiers anciens

Voici une petite procédure permettant de supprimer les fichiers datés de plus de n jours dans un répertoire Windows. Elle vous sera utile par exemple pour éviter de conserver des sauvegardes trop anciennes.


CREATE PROCEDURE [S_MAINT].[P_DELETE_FILES]  
                 @DIR VARCHAR(1024),     -- répertoire de stockage des fichiers  
                 @DAYS SMALLINT          -- nombre de jours de rétention des fichiers
AS  
/******************************************************************************
* Frédéric Brouard - alias SQLpro - http://sqlpro.developpez.com - 2011-05-08 *
*******************************************************************************
* Suppression de fichier anciens                                              *
* @DIR  : répertoire de stockage des fichiers                                 *        
* @DAYS : nombre de jours de rétention des fichiers                           *
*******************************************************************************
* copyright : Frédéric Brouard / SQLpro / SQLspot  -  http://www.sqlspot.com  *
* Expertise, audit, tuning, optimisation, conseil, formation... MS SQL Server *
******************************************************************************/
 
BEGIN  
SET NOCOUNT ON;
DECLARE @TF TABLE (FNAME VARCHAR(256),   -- variable table des fichiers
                   FDATE DATETIME2(0),  
                   FSIZE BIGINT)  
DECLARE @T TABLE (F VARCHAR(512));       -- variable table de récupération de la commande système
DECLARE @COM VARCHAR(1048),              -- variable de la commande système  
        @FN VARCHAR(256);                -- variable du nom du fichier
 
-- composition de la commande système        
SET @COM = ' DIR "' + @DIR  
           + CASE  
                WHEN SUBSTRING(@DIR, LEN(@DIR), 1) = '\'  
                   THEN ''  
                ELSE '\'  
             END + '*.*"';  
-- exécution de la commande SQL et insertion des résultats dans la variable table @T
INSERT INTO @T  
EXEC xp_cmdshell @COM;  
 
-- suppression des lignes inutiles  
DELETE FROM @T WHERE F IS NULL OR SUBSTRING(F, 1, 1) = ' ';  
DELETE FROM @T WHERE SUBSTRING(F, 22, 5) = '<REP>';  
 
-- paramétrage du format de date
SET DATEFORMAT DMY;  
 
-- découpage des différents éléments des fichiers (nom, date, taille) et insertion dans la variables table @TF  
INSERT INTO @TF  
SELECT SUBSTRING(F, 37, 475),  
       REPLACE(SUBSTRING(F, 1, 17), '  ', ' '),  
       LTRIM(REPLACE(SUBSTRING(F, 19, 17), CHAR(160), ''))  
FROM   @T;  
 
-- suppression des fichiers trop anciens  
WHILE EXISTS(SELECT *
             FROM   @TF  
             WHERE  FDATE < DATEADD(day, -10, CURRENT_TIMESTAMP))
BEGIN
   SELECT TOP 1 @FN = FNAME
   FROM   @TF
   WHERE  FDATE < DATEADD(day, -10, CURRENT_TIMESTAMP);
   SET @COM = 'DEL "' + @DIR + @FN + '"';
   EXEC xp_cmdshell @COM;
   DELETE FROM @TF WHERE FNAME = @FN;  
END;
 
END;  
GO

Exemple :

EXEC [S_MAINT].[P_DELETE_FILES] 'C:\tmp\', 10
supprime tous les fichiers vieux de plus de 10 jours dans le répertoire C:\tmp.


--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence  * * * * *

MVP Microsoft SQL Server

Laisser un commentaire