Skip to content

Commit 31eece2

Browse files
Add files via upload
0 parents  commit 31eece2

9 files changed

+1423
-0
lines changed

filepurger.dpr

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
program filepurger;
2+
3+
uses
4+
Vcl.SvcMgr,
5+
uMain in 'uMain.pas' {FilePurgerService: TService},
6+
uDeleteFiles in 'uDeleteFiles.pas',
7+
uDebugTool in 'uDebugTool.pas';
8+
9+
{$R *.RES}
10+
11+
begin
12+
// Windows 2003 Server requires StartServiceCtrlDispatcher to be
13+
// called before CoRegisterClassObject, which can be called indirectly
14+
// by Application.Initialize. TServiceApplication.DelayInitialize allows
15+
// Application.Initialize to be called from TService.Main (after
16+
// StartServiceCtrlDispatcher has been called).
17+
//
18+
// Delayed initialization of the Application object may affect
19+
// events which then occur prior to initialization, such as
20+
// TService.OnCreate. It is only recommended if the ServiceApplication
21+
// registers a class object with OLE and is intended for use with
22+
// Windows 2003 Server.
23+
//
24+
// Application.DelayInitialize := True;
25+
//
26+
if not Application.DelayInitialize or Application.Installing then
27+
Application.Initialize;
28+
Application.CreateForm(TFilePurgerService, FilePurgerService);
29+
Application.Run;
30+
end.

filepurger.dproj

+1,153
Large diffs are not rendered by default.

filepurger.dproj.local

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<BorlandProject>
3+
<Transactions>
4+
<Transaction>2024/08/07 15:59:38.000.770,=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
5+
<Transaction>2024/08/07 16:47:17.000.731,=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
6+
<Transaction>2024/08/07 16:48:11.000.489,C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\Unit1.pas=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\uMain.pas</Transaction>
7+
<Transaction>2024/08/07 16:48:11.000.489,C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\Unit1.dfm=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\uMain.dfm</Transaction>
8+
<Transaction>2024/08/07 16:48:34.000.370,C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\Project1.dproj=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\filepurger.dproj</Transaction>
9+
<Transaction>2024/08/07 16:49:21.000.013,=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\uDeleteFiles.pas</Transaction>
10+
<Transaction>2024/08/07 17:10:32.000.776,=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\Unit1.pas</Transaction>
11+
<Transaction>2024/08/07 17:10:51.000.854,C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\Unit1.pas=C:\Users\tcoat\OneDrive\Documents\Embarcadero\Studio\Projects\PurgeFiles\uDebugTool.pas</Transaction>
12+
</Transactions>
13+
</BorlandProject>

filepurger.identcache

401 Bytes
Binary file not shown.

filepurger.res

151 KB
Binary file not shown.

uDebugTool.pas

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
unit uDebugTool;
2+
3+
interface
4+
5+
procedure DebugMessage(AMessage: string);
6+
7+
implementation
8+
9+
uses Windows;
10+
11+
procedure DebugMessage(AMessage: string);
12+
begin
13+
OutputDebugString(PChar(AMessage));
14+
end;
15+
16+
17+
end.

uDeleteFiles.pas

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
unit uDeleteFiles;
2+
3+
interface
4+
5+
uses Classes, SysUtils;
6+
7+
procedure DeleteFilesOlderThan(ADirectory: string; ATime: TDateTime);
8+
9+
implementation
10+
11+
uses
12+
System.IOUtils,
13+
System.Types,
14+
WinApi.Windows,
15+
uDebugTool;
16+
17+
function FileTimeToDateTime(const AFileTime: TFileTime): TDateTime;
18+
var
19+
LocalFileTime: TFileTime;
20+
SystemTime: TSystemTime;
21+
begin
22+
// Convert the file time to local file time
23+
if not FileTimeToLocalFileTime(AFileTime, LocalFileTime) then
24+
RaiseLastOSError;
25+
// Convert the local file time to system time
26+
if not FileTimeToSystemTime(LocalFileTime, SystemTime) then
27+
RaiseLastOSError;
28+
// Convert the system time to Delphi's TDateTime
29+
Result := SystemTimeToDateTime(SystemTime);
30+
end;
31+
32+
procedure DeleteFilesOlderThan(ADirectory: string; ATime: TDateTime);
33+
var
34+
LFiles: TStringDynArray;
35+
begin
36+
DebugMessage('begin DeleteFilesOlderThan');
37+
DebugMessage(' Params: ADirectory=' + ADirectory + ',ATime=' + DateTimeToStr(ATime));
38+
39+
LFiles := TDirectory.GetFiles(ADirectory, '*',
40+
TSearchOption.soTopDirectoryOnly,
41+
function (const Path: string;
42+
const SR: TSearchRec): Boolean
43+
begin
44+
var dt := FileTimeToDateTime(SR.FindData.ftLastAccessTime);
45+
Result := dt < ATime;
46+
end);
47+
48+
for var LFileName in LFiles do
49+
begin
50+
DebugMessage(' deleting file ' + LFileName);
51+
end;
52+
DebugMessage('end DeleteFilesOlderThan');
53+
end;
54+
55+
56+
end.

uMain.dfm

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
object FilePurgerService: TFilePurgerService
2+
DisplayName = 'FilePurgerService'
3+
OnStart = ServiceStart
4+
OnStop = ServiceStop
5+
Height = 600
6+
Width = 800
7+
PixelsPerInch = 120
8+
object Timer1: TTimer
9+
OnTimer = Timer1Timer
10+
Left = 230
11+
Top = 130
12+
end
13+
end

uMain.pas

+141
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
unit uMain;
2+
3+
interface
4+
5+
uses
6+
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes,
7+
Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.ExtCtrls,
8+
System.Types;
9+
10+
type
11+
TFilePurgerService = class(TService)
12+
Timer1: TTimer;
13+
procedure Timer1Timer(Sender: TObject);
14+
procedure ServiceStart(Sender: TService; var Started: Boolean);
15+
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
16+
private
17+
type TDeleteSettings = record
18+
OlderThanDays: integer;
19+
Directories: TStringDynArray;
20+
end;
21+
22+
procedure LoadSettings(var AConfig: TDeleteSettings);
23+
procedure LogSettings(const AConfig: TDeleteSettings);
24+
public
25+
function GetServiceController: TServiceController; override;
26+
{ Public declarations }
27+
end;
28+
29+
var
30+
FilePurgerService: TFilePurgerService;
31+
32+
implementation
33+
34+
{$R *.dfm}
35+
36+
uses
37+
System.IOUtils,
38+
System.IniFiles,
39+
uDebugTool,
40+
uDeleteFiles;
41+
42+
procedure AddStringToArray(var Arr: TStringDynArray; const NewStr: string);
43+
begin
44+
SetLength(Arr, Length(Arr) + 1);
45+
Arr[High(Arr)] := NewStr;
46+
end;
47+
48+
function IsArrayEmpty(const Arr: TStringDynArray): Boolean;
49+
begin
50+
Result := Length(Arr) = 0;
51+
end;
52+
53+
procedure ServiceController(CtrlCode: DWord); stdcall;
54+
begin
55+
FilePurgerService.Controller(CtrlCode);
56+
end;
57+
58+
function TFilePurgerService.GetServiceController: TServiceController;
59+
begin
60+
Result := ServiceController;
61+
end;
62+
63+
procedure TFilePurgerService.LoadSettings(var AConfig: TDeleteSettings);
64+
const
65+
DefaultDays = 14;
66+
var
67+
Settings: TIniFile;
68+
begin
69+
var ConfigFile := TPath.ChangeExtension(ParamStr(0), '.ini');
70+
Settings := TIniFile.Create(ConfigFile);
71+
AConfig.OlderThanDays := Settings.ReadInteger('System', 'Days', DefaultDays);
72+
SetLength(AConfig.Directories, 0);
73+
74+
var LCounter := 1;
75+
var LDone := False;
76+
while not LDone do
77+
begin
78+
var DirKey := 'Dir' + LCounter.ToString;
79+
var LDir := Settings.ReadString('System', DirKey, EmptyStr);
80+
if LDir = EmptyStr then
81+
LDone := True
82+
else
83+
begin
84+
AddStringToArray(AConfig.Directories, LDir);
85+
Inc(LCounter);
86+
end;
87+
end;
88+
Settings.Free;
89+
end;
90+
91+
procedure TFilePurgerService.LogSettings(const AConfig: TDeleteSettings);
92+
begin
93+
DebugMessage('begin Configuration');
94+
DebugMessage(' .OlderThanDays=' + AConfig.OlderThanDays.ToString);
95+
for var LI := Low(AConfig.Directories) to High(AConfig.Directories) do
96+
DebugMessage(' .Directory' + LI.ToString + '=' + AConfig.Directories[LI]);
97+
DebugMessage('end Configuration');
98+
end;
99+
100+
procedure TFilePurgerService.ServiceStart(Sender: TService; var Started: Boolean);
101+
begin
102+
Timer1.Enabled := true;
103+
Started := True;
104+
LogMessage('File Purger service started', EVENTLOG_INFORMATION_TYPE);
105+
end;
106+
107+
procedure TFilePurgerService.ServiceStop(Sender: TService; var Stopped: Boolean);
108+
begin
109+
Stopped := True;
110+
LogMessage('File Purger service stopped', EVENTLOG_INFORMATION_TYPE);
111+
end;
112+
113+
procedure TFilePurgerService.Timer1Timer(Sender: TObject);
114+
var
115+
Config: TDeleteSettings;
116+
begin
117+
Timer1.Enabled := false;
118+
119+
DebugMessage('begin TFilePurgerService.Timer1Timer');
120+
try
121+
LoadSettings(Config);
122+
LogSettings(Config);
123+
if (Config.OlderThanDays > 0) and
124+
(not IsArrayEmpty(Config.Directories)) then
125+
begin
126+
var LDelOlderThan := Now - Config.OlderThanDays;
127+
for var LDir in Config.Directories do
128+
DeleteFilesOlderThan(LDir, LDelOlderThan);
129+
130+
end;
131+
Timer1.Interval := 60 * 1000 * 15; {15 minutes}
132+
except
133+
on e: exception do
134+
LogMessage('ManageDownloads::Exception=' + e.message);
135+
end;
136+
DebugMessage('end TFilePurgerService.Timer1Timer');
137+
138+
//Timer1.Enabled := True;
139+
end;
140+
141+
end.

0 commit comments

Comments
 (0)