2015-07-07

好久沒有寫DELPHI最近有一需求 記錄一下

用DELPHI開發一支程式自動檢查檔案是否建立超過天數自動刪除功能,
需求如下說明
1. 可以定義檢查路徑,路徑需可設多個
2. 可以設定副檔名,如:jpg、png等,大小寫不分
3. 可以設定天數,例如:90、100天
4. 可以往下尋找次目錄的所有檔案,目錄可能會有很多層
5. 判斷該檔案建立的時間距離目前時間的天數


此版會刪除含以下子目錄 過期之檔案 設定時 請特別注意
下圖未勾刪除

下圖 勾刪除 按儲存後 正式刪除


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IOUtils, Types, inifiles;

type
  TchkFileForm = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Days: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    TLabel3: TLabel;
    Label3: TLabel;
    FileExt: TEdit;
    Label4: TLabel;
    Memo2: TMemo;
    Label5: TLabel;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure run();
    function dayDec(s,e : String):Integer;
    function chkExt(ext: String):Boolean;
    procedure getDirs(Path: String);
    procedure getFiles(Path: String);
  end;

var
  chkFileForm: TchkFileForm;
  myinifile:TInifile;
implementation

{$R *.dfm}

procedure TchkFileForm.Button1Click(Sender: TObject);
var
  s1 : TStringList;
  myFile : TextFile;
begin
  // days
  myinifile.writeinteger('setini','Days', strtoint(Days.Text));
  // FileExt
  myinifile.writestring('setini', 'FileExt', FileExt.Text);
  // 正式刪除
  myinifile.writebool('setini', 'isDel', CheckBox1.Checked);
  //
  // 路徑資料
  s1:=TStringList.Create;
  s1.Text:=Memo1.Text;
  s1.SaveToFile('chkFilePath.txt');
  s1.Free;

  ShowMessage('儲存完成!');
  run();
end;

procedure TchkFileForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  myinifile.Destroy;
end;

procedure TchkFileForm.FormShow(Sender: TObject);
var
  myFile : TextFile;
  text   : string;
  filename:string;
begin
  filename := ExtractFilePath(paramstr(0))+'chkFile.ini';
  myinifile := TInifile.Create(filename);
  // days
  Days.Text := inttostr(myinifile.readinteger('setini', 'Days', 90));
  // FileExt
  FileExt.Text := myinifile.ReadString('setini', 'FileExt', 'jpg,png');
  // 正式刪除
  CheckBox1.Checked := myinifile.readbool('setini', 'isDel', False);
  // 路徑資料
  if FileExists('chkFilePath.txt') then
  begin
    Memo1.Lines.LoadFromFile('chkFilePath.txt');
  end;

  run();
end;

// 執行設定目錄
procedure TchkFileForm.run();
var
  i    : Integer;
  Path : String;
begin
  Memo2.Clear;
  for i := 0 to memo1.lines.count-1 do
  begin
    Path :=  Memo1.Lines[i];
    getDirs(Path)
  end;
  Memo2.Lines.Add('執行完成!');
end;
// 取出子目錄
procedure TchkFileForm.getDirs(Path: String);
var
  dfs: TStringDynArray;
  pathstr: String;
begin
  if directoryexists(Path) then
  begin
    Memo2.Lines.Add(Path);
    getFiles(Path); // 取出目錄內檔案
    dfs := TDirectory.GetFileSystemEntries(Path);
    for pathstr in dfs do getDirs(pathstr);
  end;
end;
// 取出目錄內檔案 檢查是否預期 刪除
procedure TchkFileForm.getFiles(Path: String);
var
  files : TStringDynArray;
  dir   : TDirectory;
  fname, ext  : String;
  toDay,fiDay : string;
  dd,sday : Integer;
begin
  toDay := FormatDateTime('yyyy/mm/dd', NOW);
  sday := StrToInt(Days.Text);
  files := dir.GetFiles(Path);
  for fname in files do
  begin
     ext := ExtractFileExt(fname);
     if chkExt(ext) then
     begin
       fiDay := FormatDateTime('yyyy/mm/dd', FileDateToDateTime(FileAge(fname)));
       dd := dayDec(fiDay, toDay);
       if dd >= sday then
       begin
         Memo2.Lines.Add(fname);
         if CheckBox1.Checked then
         begin
           Memo2.Lines.Add(ext + '=>' +fiDay + '=>' + IntToStr(dd) + ' 已刪除!');
           DeleteFile(fname);
         end else
         begin
           Memo2.Lines.Add(ext + '=>' +fiDay + '=>' + IntToStr(dd) + ' 可刪除!');
         end;

       end;
     end;
  end;
end;
// 計算日期差
function TchkFileForm.dayDec(s,e : String):Integer;
var
  d1:TDate;
  d2:TDate;
begin
  d1:=StrToDate(s);
  d2:=StrToDate(e);
  Result := trunc(Double(d2)-Double(d1));
end;
// 確認副檔名
function TchkFileForm.chkExt(ext: String):Boolean;
var
  a: TStringList;
  x: integer;
  s: String;
begin
  ext := UpperCase(ext);
  a := TStringList.Create;
  a.StrictDelimiter := true;    // Delphi7 沒有這個屬性 :~(
  a.Delimiter := ',';           // 指定逗點為分割字元
  a.DelimitedText := FileExt.Text;       // 要被分割的字串
  for x:=0 to (a.Count-1) do
  begin
    s := '.'+UpperCase(a[x]);
    if ext = s then Result := true;
  end;
end;

end.

2015-07-02

centOS 檢查 httpd 服務是否活著 若是沒啟動 自動重起



#!/bin/bash

if [ -z "`/etc/rc.d/init.d/./httpd status|grep 'is running'`" ]
then
        /etc/rc.d/init.d/./httpd start
        echo "`date +"%b %e %T"` httpd service is done" >> /var/log/service_test.log
fi